Python中的接口和继承的多级抽象

时间:2017-11-16 17:37:43

标签: python inheritance

我不确定如何说出这个问题,因此这个奇怪的标题。我也无法在搜索后找到任何关于此的信息,所以希望这不是重复的,我只是在寻找错误的单词。无论如何,在这种情况下,我有一个抽象的基类,里面有一些方法,它们由一个类继承。我不想在这个基类中设置其中一个方法,因为这个类要由其他类继承,以提供它们共享的通用功能。类似的东西:

class A(metaclass=abc.ABCMeta):
    @abc.abstractmethod
    def fun1(self):
        pass

   @abc.abstractmethod
    def fun2(self):
        pass

class B(A):
    def fun1(self):
        #do work here

    @abc.abstractmethod
    def fun2(self):  # Intent to have the final classes define this
        pass

class C(B):
    def fun2(self):
        # do work here    

class D(B):
    def fun2(self):
        # do work here    

我想将该函数保留为ABC.meta以强制执行最终的子节点,但因为在这种情况下可以有多种类型的B都继承自接口,我想保持最初的虚拟化在这个根类的方法,但有一种方法让B类强制它的子类必须实现这一点。如果我没有将抽象方法添加到类B中,代码就可以找到,但这很尴尬,因为子类必须实现该方法,并且不应该一直看到接口以找出他们需要实现的所有内容。如上所述,它会出错,因为B类不能将该方法声明为abc.abstract。如果我没有将它声明为抽象,则无法强制执行子类必须实现该方法。

我希望我这种令人费解的写作方式对那里的人有意义......

谢谢!

1 个答案:

答案 0 :(得分:0)

您可能不应将fun2重新定义为具体类B中的抽象方法。您正在为界面创建一组规则,但在执行此操作时会立即违反这些规则。

相反,要么定义混合类,要么CD可以继承的其他ABC。

class A(metaclass=abc.ABCMeta):
    @abc.abstractmethod
    def fun1(self):
        pass

class A2(metaclass=abc.ABCMeta):
    @abc.abstractmethod
    def fun2(self):
        pass

class B(A):
    def fun1(self):
        print('hello')

class B2(A2):
    def fun2(self):
        print('world')

class C(B, B2):
    pass

class D(B, B2):
    pass