我们如何编写一个装饰器来强制一个类从其他类继承?

问题描述 投票:0回答:1

通常,我们有一个类继承自另一个类,如下所示:

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__()
python python-3.x decorator python-decorators
1个回答
0
投票

就像@wim 评论的那样,类装饰器在创建后应用于类对象,此时它的基类已经确定并且不能更改。

解决方法是让装饰器创建一个新类,而不是基于给定的类对象,使用它的名称和类成员:

class SuperClass:
    @classmethod
    def force_inherit_from_super_class(cls, subclass):
        return type(subclass.__name__, (cls,), dict(vars(subclass)))

演示:https://replit.com/@blhsing/OnlyCompetentDeletion

© www.soinside.com 2019 - 2024. All rights reserved.