类变量属于类、被所有实例共享,实例变量属于对象、各实例独立;类变量在类定义时创建,实例变量在__init__中用self定义;访问时先查实例__dict__再查类__dict__。

Python中类变量和实例变量的核心区别在于:类变量属于类本身,被所有实例共享;实例变量属于具体对象,每个实例独立拥有。
类变量:定义在类中、方法外,所有实例共用
类变量在类定义时创建,存储在类的命名空间里。只要类存在,类变量就存在,不依赖于任何实例。
- 修改类变量可通过类名.变量名(推荐),如
MyClass.count += 1 - 若通过实例修改(如
obj.count = 5),实际是为该实例新建一个同名实例变量,不会影响类变量或其他实例 - 适合存放常量、计数器、默认配置等所有实例通用的数据
实例变量:在__init__或实例方法中用self.变量名定义
每次创建新实例时,__init__执行一次,为该实例分配独立的属性空间。
- 每个实例的实例变量互不影响,修改一个不会波及另一个
- 必须通过
self访问,如self.name = "Alice" - 未初始化就访问会触发
AttributeError,不像类变量可直接读取
变量查找顺序:从实例到类(LEGB中的“L→E”延伸)
当访问obj.x时,Python按以下顺序查找:
立即学习“Python免费学习笔记(深入)”;
- 先查该实例的
__dict__(是否有x这个实例变量) - 再查类的
__dict__(是否有x这个类变量) - 最后向上查找父类(继承链)
这就是为什么obj.x能读到类变量——但一旦给obj.x赋值,就把它“遮蔽”成了实例变量。
常见陷阱与建议
-
可变类变量要小心:如
data = []定义为类变量,所有实例会共享同一个列表,append操作会影响彼此 - 优先用实例变量存状态:用户姓名、ID、缓存数据等应绑定到实例,避免意外共享
-
类变量适合放不可变对象或明确共享逻辑的值:比如
VERSION = "1.2"、MAX_RETRY = 3 - 调试时可用
print(obj.__dict__)和print(MyClass.__dict__)直观对比两者内容










