
类变量 vs 实例变量 完整生命周期对比一、生命周期总览一句话区分类变量跟随类对象存活类一加载就存在类不销毁就一直存在和有没有实例无关实例变量跟随单个实例对象存活实例创建时才有实例被回收后立刻消失。二、分阶段拆解完整生命周期1. 创建时机类变量执行到class XXX:类定义代码时Python 自动创建类对象同时生成所有类变量存入类的__dict__。不需要创建任何实例类变量就已经存在。python运行class A: cls_val 10 # 类加载瞬间创建 print(A.cls_val) # 无实例也能直接访问实例变量只有执行A()创建实例、运行__init__时才会给当前实例分配内存、生成实例变量存入实例自己的__dict__。 没有实例就不存在实例变量。python运行class A: cls_val 10 def __init__(self): self.ins_val 20 # 实例创建时才生成 # print(A.ins_val) # 报错不存在 obj A() print(obj.ins_val) # 实例存在后才能访问2. 存活阶段类变量全局可访问只要类对象还有引用类变量就一直有效所有实例共享同一份类变量实例销毁完全不影响类变量即使所有实例全部删除、回收类变量依旧存在。python运行obj1 A() del obj1 # 删除唯一实例 print(A.cls_val) # 类变量依然存在实例变量只属于当前这一个实例仅在该实例存活期间可用。 不同实例的实例变量互相独立删除一个实例只会销毁它自己的实例变量不影响其他实例。python运行obj1 A() obj2 A() del obj1 # print(obj1.ins_val) # 报错obj1已销毁实例变量消失 print(obj2.ins_val) # obj2还在它的实例变量保留3. 销毁时机GC 垃圾回收类变量销毁条件非常苛刻类变量依附于类对象只有满足全部条件才会被回收所有地方不再使用这个类无任何变量引用类名、无实例、无模块引用手动执行del A删除类程序整体退出解释器关闭。日常业务代码中几乎不会主动销毁类类变量基本全程常驻内存。实例变量销毁条件很简单实例的引用计数变为 0Python GC 自动回收实例内存执行del 实例对象实例变量超出作用域函数局部实例执行完毕自动销毁没有任何变量再指向该实例。实例一回收它内部所有实例变量同步释放内存。三、关键边界场景对比场景 1全部实例删除类变量还在python运行class Test: cls_num 100 def __init__(self): self.ins_num 200 a Test() b Test() del a, b # 实例全部销毁 print(Test.cls_num) # 正常输出100类变量不受影响场景 2类被删除类变量彻底消失python运行del Test # print(Test.cls_num) # NameError类连同类变量一起销毁场景 3实例提前销毁实例变量无法访问python运行def func(): t Test() print(t.ins_num) func() # 函数执行完毕局部实例t自动销毁 # 外部无法拿到 t.ins_num四、生命周期核心差异表格表格维度类变量实例变量创建时机加载 class 代码时无需实例调用类名()生成实例、执行__init__时依赖载体类对象单个实例对象是否依赖实例不依赖无实例也存在完全依赖实例无实例则不存在销毁触发条件类无任何引用 /del 类 / 程序退出实例引用计数归零、del 实例、离开作用域实例销毁影响完全不受影响跟着实例一起销毁无法再访问存活时长程序运行全程绝大多数场景仅当前实例存活区间五、开发层面引申影响全局配置、全局计数器适合用类变量生命周期长全程可复用不用重复创建每个对象独有的属性用户名、订单号必须用实例变量生命周期跟随对象不会互相干扰不要用实例赋值覆盖类变量会新增一份独立实例变量多占用内存生命周期和原类变量完全割裂。