另一个类实例创建的类实例是否可以访问创建者的成员?

时间:2013-08-21 01:12:51

标签: python python-2.7

我有一个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的参数。有没有更尴尬或更聪明的方法来做到这一点?也许将所有参数放在字典中?

3 个答案:

答案 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