我对这个例子感到有些困惑:
>>> 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__
的魔力是什么?
答案 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
的每个实例独立构建。