有一个代码:class C(): a=1 def f(self): print "f func"a=C()print a.aa.f()>>> 1>>> f func当我试图获得a.__dict__或时vars(a),它告诉我公正{}。但a.b=123print a.__dict__>>> {'b': 123}我不明白,为什么会这样。
2 回答

手掌心
TA贡献1942条经验 获得超3个赞
查看a.__dict__
或vars(a)
为您提供属性a
,它是一个实例。该实例最初没有自己的属性。属性a
您在类定义创建的类本身的属性不是它的实例。稍后,当您a.b = 123
在实例上创建一个属性时,便可以在实例中看到它__dict__
。a
如果您查看,就会看到该属性C.__dict__
。
当您这样做时print a.a
,Python会a
在类上动态查找属性C
。它看到实例没有属性a
,因此它在类上查找并在那里找到一个。那就是打印的值。创建实例时,class属性不会“复制”到实例。相反,每次您尝试读取实例属性时,Python都会检查该实例属性是否存在,如果不存在,则会在类中进行查找。

弑天下
TA贡献1818条经验 获得超8个赞
>>> C.a
1
>>> vars(C)['a']
1
(vars一堂课的整个字典相当长。)
就像您的标题说的那样,它是一个类变量。它属于类,而不是对象。Python在幕后做一些特殊的逻辑,以便在调用时为您查找类型对象a.a。我不是专家,但我怀疑它正在寻找a与找到方法相同的方法。我相信在Java之类的语言中,不建议使用这种用法。我不知道它是否不建议在Python中使用。
添加回答
举报
0/150
提交
取消