You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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,提问作者Антон Пименов

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 21:32:54