1

我有一个 Python 类的实例正在创建另一个,我想知道“创建的”类是否可以访问“创建者”的成员而无需显式传递它们,或者执行以下操作:

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两者都访问,除非在实践中会有多个参数,所以将它们全部传递会导致一长串参数。我现在的解决方案是使用 aCreator作为 a 的参数Created。有没有更尴尬或更聪明的方法来做到这一点?也许将所有参数放在字典中?

4

3 回答 3

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或间接引用,例如可用于根据需要查找创建者的键。)

于 2013-08-21T01:18:15.823 回答
0

恕我直言,它看起来不错。如果参数是类属性而不是实例,你可以使用继承,但我认为不是这样的改进。

def creator_factory(param):
    class Creator(object):
        parameter = param
    return Creator

Creator = creator_factory(something)

class Created(Creator):
    pass

>>> Created().parameter
'something'
于 2013-08-21T01:28:18.287 回答
0

另外的选择

class Creator():
    def __init__(self, parameter):
        self.parameter = parameter
        self.created = Created()
        self.created.creator = self
于 2013-08-21T01:42:44.650 回答