我有一个Python类的实例正在创建另一个,我想知道“created”类是否可以访问“creator”的成员而不显式传递它们,或者做类似的事情:
class Creator(object):
def __init__(self, parameter):
self.parameter = parameter
self.created = Created(self)
class Created(object):
def __init__(self, creator):
self.creator = creator
self.parameter = self.creator.parameter
我想我正在尝试做的是允许两者都访问parameter
,除非在实践中会有多个参数,因此将它们全部传递将产生一长串参数。我现在的解决方案是使用Creator
作为Created
的参数。有没有更尴尬或更聪明的方法来做到这一点?也许将所有参数放在字典中?
答案 0 :(得分:3)
你可以做到这一点,而且你差不多完成了它,只有一个小问题:
class Created():
def __init__(self, creator):
self.parameter = self.creator.parameter
没有self.creator
。如果您在__init__
次通话后再也无需再次访问,请直接使用creator
参数:
class Created():
def __init__(self, creator):
self.parameter = creator.parameter
如果您以后需要,请将其存储为self.creator
,然后您可以在那里访问它:
class Created():
def __init__(self, creator):
self.creator = creator
self.parameter = self.creator.parameter
...虽然在这种情况下您甚至可能不需要复制parameter
,因为您始终可以self.creator.parameter
进行复制。
这是一种非常常见的模式。
唯一真正的缺点是,如果你保持反向引用(self.creator = creator
),你就不能拥有任何__del__
方法。 (或者您需要将其设为weakref
或间接引用,例如可用于根据需要查找创建者的密钥。)
答案 1 :(得分:0)
恕我直言看起来很好。如果参数是一个类属性而不是实例,你可以使用继承,但我不认为这是一个改进。
def creator_factory(param):
class Creator(object):
parameter = param
return Creator
Creator = creator_factory(something)
class Created(Creator):
pass
>>> Created().parameter
'something'
答案 2 :(得分:0)
另一个选择
class Creator():
def __init__(self, parameter):
self.parameter = parameter
self.created = Created()
self.created.creator = self