Python 继承下类变量常见陷阱 全套规避方案 代码示范先梳理继承场景下 4 个高频陷阱子类不重写父类可变类型类变量list/dict/set父子所有实例共享同一个引用改一处全受影响子类定义同名类变量以为是 “修改父类变量”实际是新建独立变量父子数据隔离造成逻辑错觉使用self.变量 值赋值误以为修改了类变量实际生成实例变量屏蔽类变量多层继承变量查找混乱分不清当前用的是自己、父类、爷爷类的属性一、陷阱 1父类可变类变量被所有子类共享最高频坑错误示范python运行class Parent: # 可变类变量所有子类、实例共用一份内存 member_list [] class Son1(Parent): pass class Son2(Parent): pass s1 Son1() s1.member_list.append(张三) # Son2、Parent 全部被污染 print(Parent.member_list) # [张三] print(Son2.member_list) # [张三]规避方案方案 1可变对象不要定义为类变量放进__init__做成实例变量首选每个实例拥有独立容器完全隔离python运行class Parent: def __init__(self): self.member_list [] # 实例变量天然隔离 class Son1(Parent): pass s1 Son1() s1.member_list.append(张三) s2 Son1() print(s1.member_list) # [张三] print(s2.member_list) # []方案 2确实需要类级别的公共容器 → 在子类主动重新覆盖类变量python运行class Parent: member_list [] class Son1(Parent): member_list [] # 子类重新开辟空间断开父类引用 class Son2(Parent): member_list []二、陷阱 2子类同名类变量覆盖误以为修改父类数据错误场景python运行class Parent: count 0 class Son(Parent): count 10 Parent.count 100 print(Son.count) # 依旧是10不会跟随变化容易产生业务bug问题子类重定义同名变量二者两块内存互不干扰。规避手段不需要隔离数据时子类不要重复定义同名类变量直接复用父类需要统一修改父类类变量统一用父类名.变量操作不要在子类重新赋值父子需要各自独立计数子类显式重写代码注释标明隔离用途。正确统一操作python运行class Parent: count 0 class Son(Parent): pass Parent.count 100 print(Son.count) # 100 同步更新三、陷阱 3实例通过 self 赋值生成实例变量屏蔽类变量继承里最容易混淆错误代码python运行class Parent: num 10 class Son(Parent): pass obj Son() obj.num 999 # 新增实例变量并没有修改Son/Parent的类变量 print(Son.num) # 10 不变 print(obj.num) # 999实例变量屏蔽规避方案修改类变量必须使用类名去修改Son.num xxx/Parent.num xxx实例内部修改类变量使用类名.变量禁止self.变量 python运行class Son(Parent): classmethod def set_num(cls, val): cls.num val # cls代表当前类标准写法 Son.set_num(999) print(Son.num) # 999 真正修改类变量如果只想修改当前对象数据就安心使用self.xxx明确区分实例数据和类公共数据四、陷阱 4多层继承属性向上查找找不到来源难以调试问题示例python运行class Grandfather: val 100 class Father(Grandfather): pass class Son(Father): pass print(Son.val) # 从爷爷类拿到值阅读代码很难一眼看出来源规避方法通用常量统一放到顶层父类代码加注释子类需要使用上层属性时不要隐式向上查找主动显式调用父类名.属性利用__mro__查看继承链排查属性来源python运行print(Son.__mro__) # (__main__.Son, __main__.Father, __main__.Grandfather, object)五、陷阱 5类变量初始化依赖顺序问题父类类变量初始化早于子类如果子类类变量初始化依赖父类变量不会出问题 但父类如果使用子类数据初始化直接报错。python运行# 错误 class Father: data Son.info class Son(Father): info test规避父类不要依赖子类的任何数据做初始化单向依赖子类可依赖父类六、通用最佳开发规范一劳永逸避开所有坑可变类型list/dict/set一律写在init作为实例变量禁止写成类变量类变量只存放全局固定常量、全局计数器、全局只读配置不可变数据str/int/float/tuple修改类变量统一使用类名.变量或者classmethod cls.变量实例中绝不使用 self 修改类变量继承体系中子类若非需要隔离数据不要重复定义和父类同名的类字段只读常量全部大写命名MAX_NUM 100一眼区分普通类变量子类需要独立的类级容器手动在子类重新初始化该类变量切断父类引用。七、标准安全写法模板python运行class Base: # 只读常量类变量安全 MAX_COUNT 100 DEFAULT_NAME system def __init__(self): # 可变数据全部实例化隔离安全 self.data_list [] self.info_dict {} classmethod def add_total(cls, num): # 统一通过类方法修改类变量 cls.MAX_COUNT num class Child(Base): # 不重复定义同名常量直接继承使用 passmp.cxxcec.netwww.cxxcec.netcxxcec.netwk592.cxxcec.netuc827.cxxcec.neter163.cxxcec.netbn499.cxxcec.netzj734.cxxcec.netqh270.cxxcec.netxf606.cxxcec.netmn941.cxxcec.netgs277.cxxcec.netrp612.cxxcec.netfj948.cxxcec.netdh283.cxxcec.netvz619.cxxcec.netnp955.cxxcec.netly290.cxxcec.netck625.cxxcec.netbt960.cxxcec.netaq295.cxxcec.nethw631.cxxcec.netsz966.cxxcec.netgm302.cxxcec.netnv637.cxxcec.netrc973.cxxcec.netjb308.cxxcec.netdf643.cxxcec.nettw979.cxxcec.netzl314.cxxcec.neteq649.cxxcec.netbk984.cxxcec.netvm320.cxxcec.netph655.cxxcec.netcx991.cxxcec.netnw326.cxxcec.netsf662.cxxcec.nethy997.cxxcec.netlj332.cxxcec.netdg668.cxxcec.netmr004.cxxcec.netqw339.cxxcec.netzs675.cxxcec.netud010.cxxcec.netfh345.cxxcec.netcv681.cxxcec.netjx016.cxxcec.netnt351.cxxcec.netbs687.cxxcec.netzp022.cxxcec.netae357.cxxcec.netwf693.cxxcec.netrk028.cxxcec.netml363.cxxcec.nethz699.cxxcec.netpg034.cxxcec.netcv369.cxxcec.netfx705.cxxcec.netdn040.cxxcec.netjt375.cxxcec.netsz711.cxxcec.netrb046.cxxcec.netew381.cxxcec.netvk717.cxxcec.netlq051.cxxcec.netdg387.cxxcec.netnz723.cxxcec.netch057.cxxcec.netpt392.cxxcec.netxf728.cxxcec.netms063.cxxcec.netgj398.cxxcec.netbh734.cxxcec.netzc069.cxxcec.netqn404.cxxcec.nethd740.cxxcec.netsx075.cxxcec.netlm410.cxxcec.netak746.cxxcec.netdv080.cxxcec.netqs415.cxxcec.nethx751.cxxcec.netfg086.cxxcec.netrb421.cxxcec.netyw757.cxxcec.netvn091.cxxcec.netcz427.cxxcec.netml762.cxxcec.netsq097.cxxcec.netep433.cxxcec.netmp.cxxcec.net/article/A2b5C7d1E9.htmlmp.cxxcec.net/article/B3c6D8e2F0.htmlmp.cxxcec.net/article/C4d7E9f3G1.htmlmp.cxxcec.net/article/D5e8F0g4H2.htmlmp.cxxcec.net/article/E6f9G1h5I3.htmlmp.cxxcec.net/article/F7g0H2i6J4.htmlmp.cxxcec.net/article/G8h1I3j7K5.htmlmp.cxxcec.net/article/H9i2J4k8L6.htmlmp.cxxcec.net/article/I0j3K5l9M7.htmlmp.cxxcec.net/article/J1k4L6m0N8.htmlmp.cxxcec.net/article/K2l5M7n1O9.htmlmp.cxxcec.net/article/L3m6N8o2P0.htmlmp.cxxcec.net/article/M4n7O9p3Q1.htmlmp.cxxcec.net/article/N5o8P0q4R2.htmlmp.cxxcec.net/article/O6p9Q1r5S3.htmlmp.cxxcec.net/blog/P7q0R2s6T4.htmlmp.cxxcec.net/blog/Q8r1S3t7U5.htmlmp.cxxcec.net/blog/R9s2T4u8V6.htmlmp.cxxcec.net/blog/S0t3U5v9W7.htmlmp.cxxcec.net/blog/T1u4V6w0X8.htmlmp.cxxcec.net/blog/U2v5W7x1Y9.htmlmp.cxxcec.net/blog/V3w6X8y2Z0.htmlmp.cxxcec.net/blog/W4x7Y9z3A1.htmlmp.cxxcec.net/blog/X5y8Z0a4B2.htmlmp.cxxcec.net/blog/Y6z9A1b5C3.htmlmp.cxxcec.net/blog/Z7a0B2c6D4.htmlmp.cxxcec.net/article/a8b1C3d7E5.htmlmp.cxxcec.net/article/b9c2D4e8F6.htmlmp.cxxcec.net/article/c0d3E5f9G7.htmlmp.cxxcec.net/article/d1e4F6g0H8.htmlmp.cxxcec.net/article/e2f5G7h1I9.htmlmp.cxxcec.net/article/f3g6H8i2J0.htmlmp.cxxcec.net/article/g4h7I9j3K1.htmlmp.cxxcec.net/article/h5i8J0k4L2.htmlmp.cxxcec.net/article/i6j9K1l5M3.htmlmp.cxxcec.net/article/j7k0L2m6N4.htmlmp.cxxcec.net/article/k8l1M3n7O5.htmlmp.cxxcec.net/article/l9m2N4o8P6.htmlmp.cxxcec.net/article/m0n3O5p9Q7.htmlmp.cxxcec.net/article/n1o4P6q0R8.htmlmp.cxxcec.net/article/o2p5Q7r1S9.htmlmp.cxxcec.net/article/p3q6R8s2T0.htmlmp.cxxcec.net/article/q4r7S9t3U1.htmlmp.cxxcec.net/article/r5s8T0u4V2.htmlmp.cxxcec.net/article/s6t9U1v5W3.htmlmp.cxxcec.net/article/t7u0V2w6X4.htmlmp.cxxcec.net/article/u8v1W3x7Y5.htmlmp.cxxcec.net/article/v9w2X4y8Z6.htmlmp.cxxcec.net/article/w0x3Y5z9A7.htmlmp.cxxcec.net/article/x1y4Z6a0B8.htmlbbs.cxxcec.net/article/A3b6C8d2E0.htmlbbs.cxxcec.net/article/B4c7D9e3F1.htmlbbs.cxxcec.net/article/C5d8E0f4G2.htmlbbs.cxxcec.net/article/D6e9F1g5H3.htmlbbs.cxxcec.net/article/E7f0G2h6I4.htmlbbs.cxxcec.net/article/F8g1H3i7J5.htmlbbs.cxxcec.net/article/G9h2I4j8K6.htmlbbs.cxxcec.net/article/H0i3J5k9L7.htmlbbs.cxxcec.net/article/I1j4K6l0M8.htmlbbs.cxxcec.net/article/J2k5L7m1N9.htmlbbs.cxxcec.net/article/K3l6M8n2O0.htmlbbs.cxxcec.net/article/L4m7N9o3P1.htmlbbs.cxxcec.net/article/M5n8O0p4Q2.htmlbbs.cxxcec.net/article/N6o9P1q5R3.htmlbbs.cxxcec.net/article/O7p0Q2r6S4.htmlbbs.cxxcec.net/blog/P8q1R3s7T5.htmlbbs.cxxcec.net/blog/Q9r2S4t8U6.htmlbbs.cxxcec.net/blog/R0s3T5u9V7.htmlbbs.cxxcec.net/blog/S1t4U6v0W8.htmlbbs.cxxcec.net/blog/T2u5V7w1X9.htmlbbs.cxxcec.net/blog/U3v6W8x2Y0.htmlbbs.cxxcec.net/blog/V4w7X9y3Z1.htmlbbs.cxxcec.net/blog/W5x8Z0a4A2.htmlbbs.cxxcec.net/blog/X6y9A1b5B3.htmlbbs.cxxcec.net/blog/Y7z0B2c6C4.htmlbbs.cxxcec.net/blog/Z8a1C3d7D5.htmlbbs.cxxcec.net/article/a9b2D4e8E6.htmlbbs.cxxcec.net/article/b0c3E5f9F7.htmlbbs.cxxcec.net/article/c1d4F6g0G8.htmlbbs.cxxcec.net/article/d2e5G7h1H9.htmlbbs.cxxcec.net/article/e3f6H8i2I0.htmlbbs.cxxcec.net/article/f4g7I9j3J1.htmlbbs.cxxcec.net/article/g5h8J0k4K2.htmlbbs.cxxcec.net/article/h6i9K1l5L3.htmlbbs.cxxcec.net/article/i7j0L2m6M4.htmlbbs.cxxcec.net/article/j8k1M3n7N5.htmlbbs.cxxcec.net/article/k9l2N4o8O6.htmlbbs.cxxcec.net/article/l0m3O5p9P7.htmlbbs.cxxcec.net/article/m1n4P6q0Q8.htmlbbs.cxxcec.net/article/n2o5Q7r1R9.htmlbbs.cxxcec.net/article/o3p6R8s2S0.htmlbbs.cxxcec.net/article/p4q7S9t3T1.htmlbbs.cxxcec.net/article/q5r8T0u4U2.htmlbbs.cxxcec.net/article/r6s9U1v5V3.htmlbbs.cxxcec.net/article/s7t0V2w6W4.htmlbbs.cxxcec.net/article/t8u1W3x7X5.htmlbbs.cxxcec.net/article/u9v2X4y8Y6.htmlbbs.cxxcec.net/article/v0w3Y5z9Z7.htmlbbs.cxxcec.net/article/w1x4Z6a0A8.htmlbbs.cxxcec.net/article/x2y5A7b1B9.htmlcxxcec.net/blog/03YR2B47.htmlwww.cxxcec.net/blog/92XQ1C36.htmlcxxcec.net/blog/81WP0D25.htmlwww.cxxcec.net/article/70VO9E14.htmlcxxcec.net/article/69UN8F03.htmlcxxcec.net/blog/58TM7G92.htmlwww.cxxcec.net/blog/47SL6H81.htmlcxxcec.net/blog/36RK5I70.htmlwww.cxxcec.net/article/25QJ4J69.htmlcxxcec.net/article/14PI3K58.htmlcxxcec.net/blog/03OH2L47.htmlwww.cxxcec.net/blog/92NG1M36.htmlcxxcec.net/blog/81MF0N25.htmlwww.cxxcec.net/article/70LE9O14.htmlcxxcec.net/article/69KD8P03.htmlcxxcec.net/blog/58JC7Q92.htmlwww.cxxcec.net/blog/47IB6R81.htmlcxxcec.net/blog/36HA5S70.htmlwww.cxxcec.net/article/25GZ4T69.htmlcxxcec.net/article/14FY3U58.htmlcxxcec.net/blog/03EX2V47.htmlwww.cxxcec.net/blog/92DW1W36.htmlcxxcec.net/blog/81CV0X25.htmlwww.cxxcec.net/article/70BU9Y14.htmlcxxcec.net/article/69AT8Z03.htmlcxxcec.net/blog/58ZS7A92.htmlwww.cxxcec.net/blog/47YR6B81.htmlcxxcec.net/blog/36XQ5C70.htmlwww.cxxcec.net/article/25WP4D69.htmlcxxcec.net/article/14VO3E58.htmlcxxcec.net/blog/03UN2F47.htmlwww.cxxcec.net/blog/92TM1G36.htmlcxxcec.net/blog/81SL0H25.htmlwww.cxxcec.net/article/70RK9I14.htmlcxxcec.net/article/69QJ8J03.htmlcxxcec.net/blog/58PI7K92.htmlwww.cxxcec.net/blog/47OH6L81.htmlcxxcec.net/blog/36NG5M70.htmlwww.cxxcec.net/article/25MF4N69.htmlcxxcec.net/article/14LE3O58.htmlcxxcec.net/blog/03KD2P47.htmlwww.cxxcec.net/blog/92JC1Q36.htmlcxxcec.net/blog/81IB0R25.htmlwww.cxxcec.net/article/70HA9S14.htmlcxxcec.net/article/69GZ8T03.htmlcxxcec.net/blog/2SJM9QS3.htmlcxxcec.net/article/UZYQL8U3.htmlwww.cxxcec.net/blog/UZWCLDDU.htmlcxxcec.net/blog/QCOUT7B2.htmlwww.cxxcec.net/article/E5GYHNKW.htmlwww.cxxcec.net/blog/9TRXFMHC.htmlcxxcec.net/article/U1M1BHF9.htmlwww.cxxcec.net/article/W6R5LPQ9.htmlcxxcec.net/blog/N50EZFZG.htmlcxxcec.net/article/G1HB7ZVF.htmlwww.cxxcec.net/blog/NU1RUJKF.htmlwww.cxxcec.net/article/2CTMMG6T.htmlwww.cxxcec.net/article/QIOAHL4L.htmlcxxcec.net/article/IUJNJN6O.htmlcxxcec.net/blog/QLM5KHWQ.htmlwww.cxxcec.net/blog/A34GGOQQ.htmlcxxcec.net/article/O3LDZA38.htmlwww.cxxcec.net/article/BG4VP7JT.htmlcxxcec.net/article/3BVWH5K8.htmlcxxcec.net/blog/0X82J0IY.htmlwww.cxxcec.net/article/H29K4N4X.htmlcxxcec.net/article/JFBH6JU2.htmlwww.cxxcec.net/blog/YZ5OWWTD.htmlcxxcec.net/blog/9D5OCP7Q.htmlwww.cxxcec.net/article/52ERFXVB.htmlwww.cxxcec.net/blog/UHHV3C39.htmlcxxcec.net/blog/KZ2Z56LL.htmlcxxcec.net/article/PPMKKSS9.htmlcxxcec.net/article/RYPUPKVJ.htmlwww.cxxcec.net/article/UDDX3CUA.htmlcxxcec.net/article/91OMABSW.htmlcxxcec.net/article/1XVM27UY.htmlcxxcec.net/article/B38SYZCN.htmlcxxcec.net/article/UMRRHM9O.htmlwww.cxxcec.net/article/B3N1FU51.htmlcxxcec.net/article/E8UIJODZ.htmlcxxcec.net/blog/X7IEDBSA.htmlwww.cxxcec.net/article/YUAVBR11.htmlcxxcec.net/article/LP1ZJYV3.htmlcxxcec.net/blog/EGGUSSEQ.htmlcxxcec.net/article/PJCYFZV5.htmlwww.cxxcec.net/blog/451O0KLJ.htmlwww.cxxcec.net/article/UR1ZJ8C2.htmlcxxcec.net/blog/QXI5H62Y.htmlwww.cxxcec.net/blog/VBJB32JI.htmlcxxcec.net/blog/1QQF4WGJ.htmlcxxcec.net/blog/E8ZC81MQ.htmlwww.cxxcec.net/article/32ANP7AN.htmlcxxcec.net/article/1OWXM3NZ.htmlwww.cxxcec.net/blog/89S7D65C.html