在__dict__中找不到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}

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


千万里不及你
浏览 277回答 2
2回答

手掌心

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

弑天下

>>> C.a1>>> vars(C)['a']1(vars一堂课的整个字典相当长。)就像您的标题说的那样,它是一个类变量。它属于类,而不是对象。Python在幕后做一些特殊的逻辑,以便在调用时为您查找类型对象a.a。我不是专家,但我怀疑它正在寻找a与找到方法相同的方法。我相信在Java之类的语言中,不建议使用这种用法。我不知道它是否不建议在Python中使用。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python