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

如何编写可强制类继承其他类的Python装饰器?

用装饰器强制类继承的实现方法

常规类继承方式

通常我们按如下方式实现类的继承:

class ChildClass(ParentClass):
    """
        ChildClass 是 ParentClass 的子类
        ParentClass 是 ChildClass 的父类
    """
    pass

这种方式适用于大多数应用场景。

需求:通过装饰器强制继承

如果我们想通过装饰器来强制某个类继承另一个类,该怎么编写对应的装饰器?比如我们希望ChildClass2和ChildClass3通过装饰器自动继承SuperClass,同时保留子类自身的方法优先级。

完整实现代码

class SuperClass:
    def __str__(self):
        return "used SuperClass.__str__ INHERRITED FROM SUPER CLASS"
    
    @classmethod
    def force_inherit_from_super_class(cls, subclass):
        # 将当前类(SuperClass)添加到子类的父类列表首位
        # 保证子类自身方法优先级高于父类,同时继承父类未被重写的方法
        subclass.__bases__ = (cls,) + subclass.__bases__
        return subclass 

#############################################################

class ChildClass1:
    pass

@SuperClass.force_inherit_from_super_class
class ChildClass2:
    pass

@SuperClass.force_inherit_from_super_class
class ChildClass3:
    def __str__(self):
        return "using ChildClass3.__str__. I HAVE OVERRIDDEN __str__"

obj1 = ChildClass1()
obj2 = ChildClass2()
obj3 = ChildClass3()

print("obj1...", str(obj1)) # 调用object.__str__()
print("obj2...", str(obj2)) # 调用SuperClass.__str__()
print("obj3...", str(obj3)) # 调用ChildClass3.__str__()

实现说明

  • 装饰器force_inherit_from_super_class作为SuperClass的类方法,接收目标子类作为参数。
  • 通过修改子类的__bases__属性,把SuperClass插入到子类的父类列表最前端,这样既让子类继承了父类的方法,又遵循Python的方法解析顺序(MRO):子类自身定义的方法会优先于父类方法被调用。
  • 运行结果完全符合预期:
    • obj1是未被装饰的类实例,调用默认的object.__str__
    • obj2通过装饰器继承了SuperClass,调用父类的__str__方法
    • obj3虽然继承了SuperClass,但自身重写了__str__,因此优先调用子类的实现

内容的提问来源于stack exchange,提问作者Toothpick Anemone

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 02:45:32