了解python中的对象关系(混淆)

时间:2013-12-26 22:23:28

标签: python oop

我对这个例子感到有些困惑:

>>> 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__的魔力是什么?

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

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

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

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