我有两个不同的类(例如A& B),我试图将A类的实例作为B类中的参数。编辑:我试图创建B类构造函数中的实例,以便我可以将它用于B类中的后续方法。
基本上这个:
class A(object):
def __init__(self, various arguments):
self.a_arguments = arguments
class B(object):
def __init__(self, various arguments):
self.b_arguments = arguments
self.a = A(arguments of A)
在这种情况下,我如何列出A"的参数?当试图创建实例self.a?当我将参数写为self.a_arguments时,它们无法被访问,因为它们属于A类而不是B类。当我尝试a_arguments时,我得到一个错误,即未定义a_arguments。然而,我不想重写B类构造函数中的所有self.a_arguments,因此我可以使用它们来创建A的实例。
答案 0 :(得分:2)
如果你想将一些不确定数量的参数传递给某些东西,你应该使用元组解包。这是一些代码:
class A(object):
def __init__(self, *args):
self.one, self.two, self.three_or_more = *args
class B(object):
def __init__(self, arg_for_b, arg2_for_b, *a_args):
self.ab = arg_for_b
self.ab2 = arg2_for_b
self.a = A(*a_args)
这是如何运作的?
类A
通过splat(*
)运算符获取任意数量的参数。使用元组解包(*var
),类one
,two
和three_or_more
的字段将分配给输入参数的第一个,第二个和其余元素。
这些可以作为foo = A(1,2,3,4,5,6,7,8,9...inf)
传递,通过将*args
放在构造函数中,可以有任意数量的args并且它们不会被强制放在列表或元组中。
B
为自己提取两个参数,剩下的参数将splat成为一个传递给A
的集合。
用法:
>>> from module import A,B
foo = B(1,2,3,4,5)
关于设计的注释 - 在一个类构造函数中初始化另一个类可能是个坏主意。如果代码看起来像这样,可能会更容易理解:
class A(object):
def __init__(self, *args):
self.one, self.two, self.three = *args
class B(object):
def __init__(self, arg_for_b, arg2_for_b, A_obj):
self.ab = arg_for_b
self.ab2 = arg2_for_b,
self.a = A_obj
>>> from module import A,B
foo = B(1,2,A(3,4,5))
答案 1 :(得分:0)
我建议为B提供类型为A的初始化对象的构造函数,例如:
class B(object):
def __init__(self, objectA):
self.b_arguments = arguments
self.a = objectA
objectB = B(A(<args>))