Python中如何通过基类函数修改子类类级属性且不重载函数
解决方法:动态获取子类类型来修改类属性
嘿,你遇到的问题根源很明确:基类A的addOne方法里直接写了A.a,这只会修改基类自己的类属性,完全没碰子类的a。要实现调用子类实例的addOne时修改子类的类属性,不用重载方法,也不用实例属性,只需要把方法里的A换成type(self)就行——它能动态拿到当前实例所属的子类。
先给你看修正后的完整代码:
class A: a = 0 def addOne(self): print(f"当前类的a值:{type(self).a}") type(self).a += 1 print(f"修改后当前类的a值:{type(self).a}") class B(A): a = 0 class C(A): a = 0 # 测试一下效果 print("初始化状态:") print(f"A.a = {A.a}, B.a = {B.a}, C.a = {C.a}") b_instance = B() print("\n调用B实例的addOne:") b_instance.addOne() print(f"A.a = {A.a}, B.a = {B.a}, C.a = {C.a}") c_instance = C() print("\n调用C实例的addOne:") c_instance.addOne() print(f"A.a = {A.a}, B.a = {B.a}, C.a = {C.a}")
运行这段代码会得到你想要的结果:
初始化状态: A.a = 0, B.a = 0, C.a = 0 调用B实例的addOne: 当前类的a值:0 修改后当前类的a值:1 A.a = 0, B.a = 1, C.a = 0 调用C实例的addOne: 当前类的a值:0 修改后当前类的a值:1 A.a = 0, B.a = 1, C.a = 1
原理解释
type(self)会返回当前实例所属的实际类:当你调用b_instance.addOne()时,self是B类的实例,type(self)就是B本身;调用c_instance.addOne()时,type(self)就是C。- 这样修改的是子类自己的类属性,既不会影响基类
A的a,也不会让B和C的属性互相干扰,完美满足你的需求:不用给每个子类都重载addOne,也完全没用到实例属性。
额外小提示
就算你的子类还有子类(比如D(B)),这个方法依然管用——type(self)会自动指向实例最底层的所属类,确保修改的是正确的类属性。
内容的提问来源于stack exchange,提问作者Ashutosh Jain
相关产品推荐
相关产品推荐

