Python中的接口和继承实现多层抽象。

4

我不太确定如何表达这个问题,因此使用了奇怪的标题。我在搜索后也没有找到有关此事的任何信息,因此希望这不是重复的内容,只是我所搜索的词汇不正确。无论如何,这就是情况,我有一个抽象的基类,在其中有一些方法,这些方法被一个类继承。我不想设置此基类中的其中一个方法,因为该类旨在被其他类继承,以提供它们都共享的常见功能。类似于:

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而产生错误。如果不将其声明为抽象,则无法强制实现该方法的子类。
我希望我的复杂表述能够使某个人感到有意义。
谢谢!

这是可行的,但实现起来非常复杂。底部的答案涉及到了你需要的内容,祝你好运:)。https://dev59.com/7YPba4cB1Zd3GeqPnREi - postoronnim
1个回答

2

在具体类B中,您可能不应该将fun2重新定义为抽象方法。这样做会违反接口的一系列规则。

相反地,您可以定义一个混合类或者另一个ABC,让CD继承它们。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接