有一个代码:
class C():
a=1
def f(self):
print "f func"
a=C()
print a.a
a.f()
>>> 1
>>> f func
当我试图得到a.__dict__
orvars(a)
时,它显示我只是{}
。但
a.b=123
print a.__dict__
>>> {'b': 123}
我不明白,为什么会这样。
有一个代码:
class C():
a=1
def f(self):
print "f func"
a=C()
print a.a
a.f()
>>> 1
>>> f func
当我试图得到a.__dict__
orvars(a)
时,它显示我只是{}
。但
a.b=123
print a.__dict__
>>> {'b': 123}
我不明白,为什么会这样。
查看a.__dict__
或vars(a)
为您提供 的属性a
,这是一个实例。该实例最初没有自己的属性。a
您在类定义中创建的属性是类本身的属性,而不是其实例的属性。稍后,当您这样做时a.b = 123
,您只在实例上创建一个属性,因此您可以在实例中看到它__dict__
。a
如果您查看 ,您将看到该属性C.__dict__
。
当你这样做时print a.a
,Python 会动态地查找a
类的属性C
。它看到实例没有属性a
,所以它查看类并在那里找到一个。那就是打印的值。创建实例时,类属性不会“复制”到实例;相反,每次你尝试读取实例属性时,Python 都会检查它是否存在于实例中,如果不存在,它会在类中查找它。
>>> C.a
1
>>> vars(C)['a']
1
(一个类的整个vars
字典相当长。)
正如你的标题所说,它是一个类变量。它属于类,而不是对象。当您调用a.a
. 我不是专家,但我怀疑它正在寻找a
与寻找方法相同的方式。在 Java 等语言中,我认为不鼓励这种用法。我不知道在 Python 中是否不鼓励这样做。