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

Python中带接口和继承的多级抽象,python,inheritance,Python,Inheritance,我不太清楚这个问题该怎么表达,因此有了一个奇怪的标题。在搜索之后,我也找不到关于这个的任何信息,所以希望这不是重复的,我只是在搜索错误的单词。无论如何,这里是这样的情况,我有一个抽象基类,里面有一些方法,它是由一个类继承的。我不想在这个基类中设置一个方法,因为这个类将被其他类继承,以提供它们共享的公共功能。比如: class A(metaclass=abc.ABCMeta): @abc.abstractmethod def fun1(self): pass

我不太清楚这个问题该怎么表达,因此有了一个奇怪的标题。在搜索之后,我也找不到关于这个的任何信息,所以希望这不是重复的,我只是在搜索错误的单词。无论如何,这里是这样的情况,我有一个抽象基类,里面有一些方法,它是由一个类继承的。我不想在这个基类中设置一个方法,因为这个类将被其他类继承,以提供它们共享的公共功能。比如:

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。如果我不将其声明为抽象,就没有办法强制子类必须实现该方法

我希望我写这篇文章的复杂方式对外面的人有意义


谢谢

您可能不应该将
fun2
重新定义为具体类
B
中的抽象方法。您正在为接口创建一组规则,但这样做时会立即违反这些规则

相反,可以在类中定义一个混合,或者定义一个可以继承的附加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

这是可行的,但实现起来确实很复杂。底部的答案是得到你需要的,祝你好运:)。