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

Python类参数存储位置解析:类属性为何未在实例__dict__中?

Python类属性与实例属性的存储区别

嘿,这个问题问到点子上了!这其实是Python中类属性和实例属性存储机制的核心差异,我来给你掰扯清楚:

1. 类属性存在哪儿?

你定义的m = 19是类属性,它并不存在于实例的__dict__里,而是存储在**类本身的__dict__**中。你可以直接打印类的字典来验证:

class foo:
    m = 19
    def __init__(self):
        self.z = 7
        self.y = 12
        self.p = 26

print(foo.__dict__)

输出里肯定能看到'm': 19,还有类的其他内置属性(比如__init__、__module__等)。

2. 为什么实例__dict__里没有m?

实例的__dict__只存储该实例独有的属性——也就是你在__init__里用self.xxx定义的z、y、p这些。而类属性是属于类本身的,由所有实例共享,不会被拷贝到每个实例的字典里。

那你可能会问:为什么我能通过ins.m访问到19?这是因为Python有一套属性查找链:

  • 当你访问ins.m时,Python先在ins.__dict__里找m,找不到就去foo.__dict__里找,再找不到就去父类的__dict__里逐层查找,直到找到或者抛出AttributeError。

3. 什么时候实例__dict__会出现m?

如果你给实例单独赋值m:

ins = foo()
ins.m = 99
print(ins.__dict__)

这时候输出就会包含'm': 99——因为你给实例创建了一个同名的实例属性,它会覆盖类属性的查找(此时ins.m取实例自己的99,而foo.m还是原来的19)。

总结一下

  • 类属性:存在类的__dict__中,所有实例共享,不会进入单个实例的字典
  • 实例属性:存在对应实例的__dict__中,每个实例独有
  • 属性查找优先级:实例__dict__ > 类__dict__ > 父类__dict__

内容的提问来源于stack exchange,提问作者Günel Resulova

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 04:57:57