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

如何通过类装饰器p()让类自动继承抽象类P?

实现自动继承抽象类的类装饰器

当然可以实现!你只需要在装饰器里修改被装饰类的继承关系,让它自动继承抽象类P,不用手动写class Child(P):。

以下是具体的实现方案:

方案1:直接修改类的基类

这种方式直接修改原类的__bases__属性,把P添加到基类列表最前面(保证抽象类的方法优先级),同时避免重复添加:

from abc import ABC, abstractmethod

# 定义抽象类P
class P(ABC):
    @abstractmethod
    def required_method(self):
        """子类必须实现的抽象方法"""
        pass

def p():
    def decorator(cls):
        # 检查类是否已经继承了P,避免重复操作
        if not issubclass(cls, P):
            # 将P添加到基类的最前面
            cls.__bases__ = (P,) + cls.__bases__
        return cls
    return decorator

使用示例

@p()
class Child:
    # 必须实现抽象类的方法,否则实例化会报错
    def required_method(self):
        print("Child 实现了抽象方法")

# 验证继承关系
print(issubclass(Child, P))  # 输出: True

# 实例化并调用方法
child = Child()
child.required_method()  # 输出: Child 实现了抽象方法

方案2:创建包装类(不修改原类)

如果你不想修改原类的基类,可以创建一个新的包装类,让它同时继承P和原类,再返回这个新类:

def p():
    def decorator(cls):
        if issubclass(cls, P):
            return cls
        
        # 创建新类,继承P和原类
        class WrappedClass(P, cls):
            pass
        
        # 保留原类的名称和模块信息,避免混淆
        WrappedClass.__name__ = cls.__name__
        WrappedClass.__module__ = cls.__module__
        
        return WrappedClass
    return decorator

注意事项

  • 如果被装饰的类已经继承了其他类,两种方案都会自动保留原有继承关系,同时添加P作为父类。
  • 抽象类的约束依然生效:被装饰的类必须实现P中定义的所有抽象方法,否则实例化时会抛出TypeError。

内容的提问来源于stack exchange,提问作者Tomer Wolberg

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 04:17:40