为什么我的实例变量不在 __dict__ 中?

39 投票
2 回答
5928 浏览
提问于 2025-04-11 09:17

如果我创建一个类 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 的值。

撰写回答