Python类的静态属性:随实例重复创建还是所有实例共享?
Python类属性(静态属性)的存储机制
Python里所谓的“静态属性”其实就是类属性,它是所有实例共享的,不会为每个对象单独创建副本。
举个直观的代码例子:
class MyClass: static_attr = 10 # 这就是类级别的属性,对应你说的静态属性 # 实例化两个对象 obj1 = MyClass() obj2 = MyClass()
验证共享特性:
- 初始状态下,两个实例访问的都是类本身的属性:
print(obj1.static_attr) # 输出 10 print(obj2.static_attr) # 输出 10
- 修改类的属性后,所有实例都会同步拿到新值:
MyClass.static_attr = 20 print(obj1.static_attr) # 输出 20 print(obj2.static_attr) # 输出 20
- 只有当某个实例主动给该属性赋值时,才会在这个实例自己的命名空间里创建一个独立副本,此时该实例访问的是自己的副本,不影响其他实例和类本身的属性:
obj1.static_attr = 30 print(obj1.static_attr) # 输出 30(实例专属副本) print(obj2.static_attr) # 输出 20(还是类的属性) print(MyClass.static_attr) # 输出 20
对比你熟悉的C++:
Python的类属性和C++的静态成员逻辑一致——属于类而非实例,所有实例共享同一份数据。不过Python没有专门划分“静态内存区域”,类和实例都是以对象形式存在于堆内存中,类属性存储在类对象的__dict__字典里,实例访问属性时,会先查自己的__dict__,找不到就往上找类的__dict__。
内容的提问来源于stack exchange,提问作者Nicolas Al Ahmar
相关产品推荐
相关产品推荐

