Python中如何修改类基类以复用代码实现新功能?
问题描述
现有如下Python类:
class A: def __call__(self): print("a") class B(A): def __call__(self): super().__call__() print('b') class C(B): def __call__(self): super().__call__() print('c')
调用后输出:
>>> c = C() >>> c() a b c
希望实现一个类,调用后输出:
a2 b c
不想重复编写B、C的代码,期望通过修改基类的方式复用原有代码,达到类似以下的效果:
class A2: def __call__(self): print("a2") B2 = B.change_base_to(A2) C2 = C.change_base_to(B2) >>> c2 = C2() >>> c2() a2 b c
解决方案
可以通过动态创建新类的方式实现需求,利用Python内置的type()函数生成新类,复用原类的所有方法和属性,仅替换基类。
方法一:给类添加change_base_to类方法
直接给原有类绑定一个类方法,让调用方式完全贴合预期:
class A: def __call__(self): print("a") class B(A): def __call__(self): super().__call__() print('b') class C(B): def __call__(self): super().__call__() print('c') # 定义通用的基类替换逻辑 def _change_base_to(cls, new_base): # 用type创建新类:类名、新基元组、复制原类的属性字典 return type(f"{cls.__name__}With{new_base.__name__}", (new_base,), cls.__dict__.copy()) # 给所有类绑定类方法 A.change_base_to = classmethod(_change_base_to) B.change_base_to = classmethod(_change_base_to) C.change_base_to = classmethod(_change_base_to) # 测试代码 class A2: def __call__(self): print("a2") B2 = B.change_base_to(A2) C2 = C.change_base_to(B2) c2 = C2() c2() # 输出: # a2 # b # c
方法二:使用工具函数(更简洁)
如果不需要给类绑定方法,直接定义一个工具函数即可,用法同样清晰:
class A: def __call__(self): print("a") class B(A): def __call__(self): super().__call__() print('b') class C(B): def __call__(self): super().__call__() print('c') def change_base(cls, new_base): return type(f"{cls.__name__}({new_base.__name__})", (new_base,), cls.__dict__.copy()) # 测试代码 class A2: def __call__(self): print("a2") B2 = change_base(B, A2) C2 = change_base(C, B2) c2 = C2() c2() # 输出: # a2 # b # c
核心逻辑说明
type()是Python创建类的底层方式,参数分别为:新类名称、基类元组、类的属性和方法字典- 复制原类的
__dict__可以完整复用原有方法和属性,不会影响原类的结构 - 生成的新类名称采用原类名+新基类名的组合,便于调试和区分不同类版本
内容的提问来源于stack exchange,提问作者Антон Пименов
相关产品推荐
相关产品推荐

