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
相关产品推荐
相关产品推荐

