通常,我们有一个类继承自另一个类,如下所示:
class ChildClass(ParentClass):
"""
ChildClass is a subclass of ParentClass
ParentClass is a superclass of ChildClass
"""
pass
这对大多数应用程序来说都很好。
但是,我们如何编写一个装饰器来强制一个类继承另一个类?
class SuperClass:
def __str__(self):
return "used SuperClass.__str__ INHERRITED FROM SUPER CLASS"
@classmethod
def force_inherit_from_super_class(cls, subclass):
# should have some more code in here somewhere
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)) # should use object.__str__()
print("obj2...", str(obj2)) # should use SuperClass.__str__()
print("obj3...", str(obj3)) # should use ChildClass3.__str__()
就像@wim 评论的那样,类装饰器在创建后应用于类对象,此时它的基类已经确定并且不能更改。
解决方法是让装饰器创建一个新类,而不是基于给定的类对象,使用它的名称和类成员:
class SuperClass:
@classmethod
def force_inherit_from_super_class(cls, subclass):
return type(subclass.__name__, (cls,), dict(vars(subclass)))