You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python类中为何b.__dict__与b._di输出结果一致?

问题解答:为何b.__dict__与b._di输出相同?

问题描述

我能理解print(b.__dict__)会输出{'state': 'Init'},但搞不懂为什么print(b._di)也会输出一模一样的内容。

代码示例

class A:
    _di = {}
    
    def __init__(self):
        self.__dict__ = self._di


class B(A):
    def __init__(self):
        super().__init__()
        self.state = "Init"


b = B()
print(b.__dict__) # {'state': 'Init'}
print(b._di) # {'state': 'Init'}

原因解析

  1. 类属性_di的特性:A类里定义的_di = {}是类属性,它属于A类本身,所有A的子类实例(比如B的实例b)都会共享这个字典对象,而非每个实例拥有独立副本。
  2. __dict__的赋值逻辑:在A的__init__方法里,self.__dict__ = self._di直接把实例的属性字典__dict__指向了类属性_di的引用。这意味着b.__dict__和b._di本质上是同一个字典对象。
  3. 属性赋值的本质:当执行self.state = "Init"时,Python会将键值对存入实例的__dict__——但由于__dict__已经和_di指向同一字典,所以这次赋值其实就是在修改_di的内容。

简单来说:操作实例属性时,你直接修改了共享的类属性字典,所以不管通过__dict__还是_di访问,看到的都是同一个字典的内容。

举个额外的验证例子:

b2 = B()
print(b2._di) # 同样会输出{'state': 'Init'}

这也能直接证明_di是所有实例共享的类属性。

内容的提问来源于stack exchange,提问作者Anne Maier

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 08:07:06