如何编写可强制类继承其他类的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
相关产品推荐
相关产品推荐

