有一个代码:
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}
我不明白,为什么会这样。
答案 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中气馁。