理解python中的对象关系(混淆)[重复]

问题描述 投票:1回答:2

这个问题在这里已有答案:

我对这个例子有点困惑:

>>> class A:
...     foo = []
>>> a, b = A(), A()
>>> a
<__main__.A instance at 0x0000000002296A88>
>>> b
<__main__.A instance at 0x0000000002296F88>
>>> a.foo.append(5)
>>> a.foo
[5]
>>> b.foo
[5]

1)python如何连接两个不同的实例?

2)在追加值后,实例是否引用了类A()foo属性?

但是当我添加__init__方法时,事情看起来不同:

>>> class A:
...     def __init__(self):
...             self.foo = []
...
>>> a, b = A(), A()
>>> a
<__main__.A instance at 0x00000000021EC508>
>>> b
<__main__.A instance at 0x0000000002296F88>
>>> a.foo.append(5)
>>> a.foo
[5]
>>> b.foo
[]

3)__init__的魔力是什么?

python oop
2个回答
1
投票

在第一个示例中,foo是一个类属性,而不是实例属性。这意味着它在A的所有实例中共享,您可以查看:

a1 = A()
a2 = A()
print a1.foo is a2.foo
print a1.foo is A.foo

然而,在你的第二个例子中,self.foo = []使foo成为一个实例属性,为A的每个实例独立构建。


2
投票

在第一种情况下,foo = []在类定义时完成,因此单个列表与类相关联,而不是与实例相关联。

在第二种情况下,self.foo = []在实例初始化时完成(这是__init__的实例初始化),因此单独的列表与每个实例相关联。

© www.soinside.com 2019 - 2024. All rights reserved.