在另一个类构造函数(python)

时间:2017-11-01 17:26:21

标签: python

我有两个不同的类(例如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的实例。

2 个答案:

答案 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),类onetwothree_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>))