首页 > 解决方案 > 继承一个非抽象类并将其所有函数转换为抽象方法

问题描述

给了我一个上游接口,它的所有功能都定义为非抽象的,而实际上它们应该用@abstractmethods 装饰。当我在调用它时没有实现它的一个功能时,我想收到一个错误。为此,我将创建一个包装类并手动检查其定义的每个函数并执行以下操作:

from abc import ABC, abstractmethod

class Foo(object):
    def foo(self):
        print("Foo")

class AbstractFoo(Foo, ABC):
    @abstractmethod
    def foo(self):
        return super().foo()

class ConcreteFoo(AbstractFoo):
    def foo(self):
        print("Concrete Foo")
        super().foo()

f = ConcreteFoo()
f.foo()

哪个输出:

Concrete Foo
Foo

我想要某种方式对Foo 定义的所有函数执行此操作。显然,继承的魔术函数喜欢__str__并且__repr__应该适当地转发。

有谁知道这样做的好方法?

标签: pythoninheritanceabstract-class

解决方案


def validate_base_class_implemntation(cls):
    base_cls_funcs = []
    for attr in cls.__bases__[0].__dict__:
        if callable(getattr(cls, attr)):
            base_cls_funcs.append(attr)

    cls_funcs = []
    for attr in cls.__dict__:
        if callable(getattr(cls, attr)):
            cls_funcs.append(attr)

    missing_funcs = [x for x in base_cls_funcs if x not in cls_funcs]

    if len(missing_funcs) > 0:
        print("Not implemented functions are: {}".format(','.join(missing_funcs)))
        raise Exception("Not implement function exception!")

    return cls


class Foo(object):
    def foo(self):
        print("Foo")

    def boo(self):
        print("Wow")


@validate_base_class_implemntation
class ConcreteFoo(Foo):
    def foo(self):
        print("Concrete Foo")
        super().foo()


f = ConcreteFoo()
f.foo()

如果那是你的意思,100% 不确定。

这个装饰器检查装饰的类是否实现了所有基类函数(在你的情况下,它们没有用抽象装饰)。如果您的装饰类未实现某个功能,则会引发异常。


推荐阅读