
在 Python 中,实例变量默认不共享,若需子类修改后所有实例同步更新,应使用类变量并显式通过类名赋值,而非 self。
在 python 中,实例变量默认不共享,若需子类修改后所有实例同步更新,应使用类变量并显式通过类名赋值,而非 `self`。
在 Python 面向对象编程中,一个常见误区是认为在父类 __init__ 中初始化的属性(如 self.shared_variable)天然被所有子类实例“共享”。实际上,每个实例调用 super().__init__() 时都会独立创建一份该属性的副本——它属于实例(instance variable),而非类(class variable)。因此,child1_instance.shared_variable = "New value" 仅修改了 child1_instance 自己的副本,对 child2_instance 完全无影响。
要实现真正的跨实例共享,必须使用类变量(class variable):将变量定义在类体顶层、所有方法之外。例如:
class Parent:
shared_variable = "I am a shared variable" # ✅ 类变量,所有实例共享
class Child1(Parent):
def change_variable(self, new_value):
Parent.shared_variable = new_value # ✅ 正确:通过类名修改类变量
class Child2(Parent):
pass⚠️ 关键注意事项:
- ❌ 错误写法:self.shared_variable = new_value —— 这会在当前实例上创建同名实例变量,遮蔽类变量,后续 self.shared_variable 将读取该实例变量,不再访问类变量;
- ✅ 正确写法:Parent.shared_variable = new_value —— 直接修改类层级的变量,所有未覆盖该属性的实例都会立即反映变更;
- 子类也可定义自己的类变量(如 Child1.shared_variable = ...),但这会为该子类及其后代创建独立副本,不影响 Parent 或其他子类(如 Child2),适用于分支隔离场景。
完整可运行示例:
立即学习“Python免费学习笔记(深入)”;
class Parent:
shared_variable = "I am a shared variable"
class Child1(Parent):
def change_variable(self, new_value):
Parent.shared_variable = new_value
class Child2(Parent):
pass
child1 = Child1()
child2 = Child2()
print(child1.shared_variable) # 输出: I am a shared variable
child1.change_variable("New value from Child1")
print(child2.shared_variable) # 输出: New value from Child1 ✅总结:共享状态需依赖类变量,并始终通过 ClassName.attribute 显式访问与修改;依赖 self 的赋值操作默认操作实例域,无法达成全局同步效果。


















