为什么我的实例变量不在 __dict__ 中?
如果我创建一个类 A
,代码如下:
class A:
def __init__(self):
self.name = 'A'
查看这个类的 __dict__
属性,结果是 {'name': 'A'}
,这表示这个类有一个叫做 name
的属性,值是 'A'
。
但是如果我创建一个类 B
:
class B:
name = 'B'
这时 __dict__
是空的。
那么这两个类有什么区别呢?为什么在 B
的 __dict__
中看不到 name
呢?
2 个回答
13
class A:
def _ _init_ _(self):
self.name = 'A'
a = A()
在对象实例 a 上创建一个属性,这个属性的类型是 A,因此你可以在 a.__dict__
中找到它。
class B:
name = 'B'
b = B()
在类 B 上创建一个属性,这个属性可以在 B.__dict__
中找到。如果你有一个 B 类型的实例 b,你也可以在 b.__class__.__dict__
中看到类级别的属性。
47
B.name
是一个类属性,而不是实例属性。你可以在 B.__dict__
中看到它,但在 b = B(); b.__dict__
中看不到。
这个区别有点模糊,因为当你在一个实例上访问属性时,类的字典会作为备用。所以在上面的例子中,b.name
会给你 B.name
的值。