我定义了如下简单的类:
>>> class myclass(object):
name = "google"
我正在创建一个名为属性的实例
>>> a = myclass()
>>> a.name
'google'
并且直接从类本身调用它。
>>> myclass.name
'google'
到目前为止(因为我有C#和Java的背景)我将调用myclass.name
静态调用并从实例调用静态成员是正常的。
但是我所观察到的是,在我将a.name
设置为其他值之前,更改myclass.name
也会影响a.name
。设置a.name
后,更改myclass.name
不会再影响a.name
,并且它们会开始具有不同的值。
您可以在下面看到整个实验:
>>> class myclass(object):
name = "google"
>>> myclass.name
'google'
>>> a = myclass()
>>> a.name
'google'
>>> myclass.name = "yahoo"
>>> a.name
'yahoo'
>>> myclass.name = "hello world"
>>> a.name
'hello world'
>>> myclass.name
'hello world'
>>> myclass.name = "another trick"
>>> myclass.name
'another trick'
>>> a.name
'another trick'
>>> a.name = "I changed the value of a"
>>> a.name
'I changed the value of a'
>>> myclass.name
'another trick'
>>> myclass.name = "changed again"
>>> a.name
'I changed the value of a'
我希望有人解释这种行为背后的原因。
感谢。
答案 0 :(得分:4)
我查看了Python Data Model文档。如果您跳到“类实例”部分,您将看到关键的解释:
属性赋值和删除更新实例的字典, 从来没有班级的字典。
因此,在您的示例中,当您执行a.name = ...
时,您会在name
中引入新密钥__dict__
。之后,当您访问name
属性时,标准属性查找机制首先会查看__dict__
。