以下是一段代码:
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}
我不明白,为什么会这样。
以下是一段代码:
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}
a.__dict__
或 vars(a)
可以获得 a
的属性,它是一个实例。该实例最初没有自己的属性。你在类定义中创建的属性 a
是类本身的属性,而不是它的实例属性。稍后当你执行 a.b = 123
时,你就在实例上创建了一个属性,因此你可以在实例的 __dict__
中看到它。如果你查看 C.__dict__
,你将看到属性 a
。print a.a
时,Python 动态地在类 C
上查找属性 a
。它发现该实例没有属性 a
,因此它在类上查找并找到一个。这是打印的值。类属性在实例创建时不会被“复制”到实例中;相反,每次尝试读取实例属性时,Python 都会检查它是否存在于实例上,如果不存在,则会在类上查找。>>> C.a
1
>>> vars(C)['a']
1
整个类的vars
字典相当长。
正如标题所示,这是一个类变量。它属于类而不是对象。在调用a.a
时,Python在后台执行一些特殊逻辑来为您查找类型对象。我不是专家,但我猜测它会像查找方法一样查找a
。在像Java这样的语言中,我认为这种用法是不鼓励的。我不知道Python是否也不鼓励。
print a.a
打印出 1,这可能是一个困惑的点。 - millimoose