关于OOP:了解Python中的对象关系(混淆)

Understanding objects relationship in python (confusion)

本问题已经有最佳答案,请猛点这里访问。

我对这个例子有点困惑:

1
2
3
4
5
6
7
8
9
10
11
12
>>> 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__方法时,情况看起来不同:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
>>> 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__的魔力是什么?


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

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


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

1
2
3
4
a1 = A()
a2 = A()
print a1.foo is a2.foo
print a1.foo is A.foo

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