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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了理解python中的对象关系(混淆)[重复]相关的知识,希望对你有一定的参考价值。

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

我对这个例子有点困惑:

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

答案

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

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

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

另一答案

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

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

以上是关于理解python中的对象关系(混淆)[重复]的主要内容,如果未能解决你的问题,请参考以下文章

理解Python中的闭包

字典键类型混淆isinstance python [重复]

如何从 Python 中的混淆矩阵中获取精度、召回率和 f 度量 [重复]

如何将字节数组附加到Go中的字节片[重复]

Python中封装方法代码的输出混淆[重复]

Python中的多态如何理解?(转帖,让我很理解。)