如何继承并强制使用__metaclass__ = ABCMeta在超类中定义的抽象方法

问题描述

一个类A(在另一个包中),该类使用通过设置my_abstract_method()来定义抽象类的旧方法来定义抽象方法__Metaclass__ = ABCMeta

我的类B是A的子类,我希望B继承A的my_abstact_method(),并要求B的所有子类实现my_abstract_method()

我将如何去做?

示例:

from abc import abstractmethod,ABC,ABCMeta


class A(object):
    __Metaclass__ = ABCMeta

    @abstractmethod
    def my_abstract_method(self):
        return

class B(A,Metaclass=ABCMeta):

    pass

B()

执行后,将成功创建B()。

由于未定义A的抽象方法,如何使B()失败?

解决方法

编辑: 除了显而易见的问题之外,很难理解这里的问题是什么—以下解决方案可能或可能与实际实现相关。

下面的解决方案引入了另一层抽象,打破了“继承的解决方案不是更多的继承”的原则,但这可能是一种特殊情况,可能对您的场景有用。

from abc import abstractmethod,ABC,ABCMeta


class A(object):
    __metaclass__ = ABCMeta

    @abstractmethod
    def my_abstract_method(self):
        return


class C(A,ABC):    
    @abstractmethod
    def new_abstract_method(self):
        pass


class B(C):
    pass
    

B()