【问题标题】:Multilevel abstraction with interface and inheritance in PythonPython中具有接口和继承的多级抽象
【发布时间】:2017-11-16 17:37:43
【问题描述】:

我不完全确定如何表达这个问题,因此这个奇怪的标题。搜索后我也找不到任何关于此的信息,所以希望这不是重复的,我只是在搜索错误的单词。无论如何,情况就是这样,我有一个抽象基类,其中包含一些方法,它是由一个类继承的。我不想在这个基类中设置其中一种方法,因为这个类旨在被其他类继承以提供它们都共享的通用功能。比如:

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

我希望我写这篇文章的复杂方式对那里的人有意义......

谢谢!

【问题讨论】:

标签: python inheritance


【解决方案1】:

您可能不应该将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

【讨论】:

    猜你喜欢
    • 2015-10-16
    • 1970-01-01
    • 1970-01-01
    • 2013-01-09
    • 2019-01-09
    • 1970-01-01
    • 1970-01-01
    • 2012-03-04
    • 2014-03-11
    相关资源
    最近更新 更多