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
这是可行的,但实现起来确实很复杂。底部的答案是得到你需要的,祝你好运:)。