python中的类变量在__dict__中找不到

时间:2013-06-08 19:35:14

标签: python

有一个代码:

class C():
    a=1
    def f(self):
        print "f func"

a=C()
print a.a
a.f()
>>> 1
>>> f func

当我尝试获取a.__dict__vars(a)时,它只显示{}。 但

a.b=123
print a.__dict__
>>> {'b': 123}

我不明白,为什么会这样。

2 个答案:

答案 0 :(得分:4)

查看a.__dict__vars(a)会为您提供a的属性,这是一个实例。该实例最初没有自己的属性。您在类定义中创建的属性a是类本身的属性,而不是其实例的属性。稍后当您执行a.b = 123时,您只需在实例上创建一个属性,因此您可以在实例__dict__中看到它。如果查看a,您会看到属性C.__dict__

执行print a.a时,Python会在类a上动态查找属性C。它看到实例没有属性a,因此它在类上查找并在那里找到一个。这是打印的值。创建实例时,class属性不会“复制”到实例;相反,每次尝试读取实例属性时,Python都会检查它是否存在于实例上,如果没有,它会在类中查找它。

答案 1 :(得分:2)

>>> C.a
1
>>> vars(C)['a']
1

(类的整个vars字典相当长。)

就像你的标题所说,它是一个类变量。它属于类,而不是对象。当你调用a.a时,Python正在幕后做一些特殊的逻辑来查看类型对象。我不是专家,但我怀疑它发现a的方式与找到方法的方式相同。在Java等语言中,我认为不鼓励使用这种用法。我不知道它是否在Python中气馁。