让实例了解包含它的实例

时间:2018-01-08 12:14:08

标签: python class instance

class Bar:
    def __init__(self):
        pass


class Foo:
    def __init__(self):
        self.items = [Bar(), Bar(), Bar()]

a = Foo()

在此示例中,Foo的属性items包含Bar的实例。

在Python 3.5中,我该怎么做:

class Bar:
    def __init__(self):
        print(container.baz)

其中container.baz引用包含它的baz实例中的属性Foo

背景

我正在尝试创建一些内容,其中每个Bar都有一个id属性,由idGenerator()半随机生成。部分ID是属于Foo.items实例的Bar索引,ID是从Bar内生成的。我希望能够解决问题。

1 个答案:

答案 0 :(得分:3)

只需将self传递给Bar(),然后完成:

class Bar:
    def __init__(self, parent):
        self.id = generate_id(self, parent)

class Foo:
    def __init__(self):
        self.items = [Bar(self), Bar(self), Bar(self)]

如果您可以传递self以外的更具体的信息,请执行此操作。

Python对象对它们的引用加载一直在创建和删除。在您的示例中,列表中包含三个类的实例,该列表是从Foo的实例引用的。但是会有其他参考。像a.items[0]和Python堆栈一样,在它的生命周期中。 Python没有本地工具可以让你发现对象存在哪些引用,因为它非常,非常,非常快速地无用,不断变化和过时。

只需显式,并传递您需要的信息,可以是self(因此对Foo()实例的引用),或者您需要的其他内容{ {1}}做它的工作。