从类和实例变量调用属性时的不同行为

时间:2011-11-14 03:52:55

标签: python

我定义了如下简单的类:

>>> 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'

我希望有人解释这种行为背后的原因。

感谢。

1 个答案:

答案 0 :(得分:4)

我查看了Python Data Model文档。如果您跳到“类实例”部分,您将看到关键的解释:

  

属性赋值和删除更新实例的字典,   从来没有班级的字典。

因此,在您的示例中,当您执行a.name = ...时,您会在name中引入新密钥__dict__。之后,当您访问name属性时,标准属性查找机制首先会查看__dict__