首页 > 解决方案 > 如何从 ABC 和另一个类继承

问题描述

我有一堂课

class A(ABC):
  @abstractmethod
  def m():
    pass

和一堆继承自它的类。

class M1(A):
  ...

class M2(A):
  ...

...

其中一些有很多共同点,因为它们共享很多功能,因此我想介绍一个本身继承自的通用基类A,但它没有引入任何新@abstractmethod方法:


       A
       |
  +----+----+
  |    |    |
  M1   M2   B
            |
         +--+--+
         |     |
         K1   K2

的定义应该是什么class B样的?

我在 Python 3.8

编辑:我特别问 PyCharm 告诉我“B 必须继承所有抽象方法”

标签: pythonoopinheritancepython-3.8

解决方案


你可以简单地使用

class B(A):
   pass

或所有儿童通用但没有m. 由于没有 ,这仍然是抽象的m


另一种方法是使用

class B(A, ABC):
   pass

在我看来,这不太好。这表明 thatB既是 anA又是 an ABC,而前一种替代表明 thatB是 an A,并且它是 an 和an本身ABC一样。AABC

考虑一下您稍后决定的情况,毕竟这A不是。ABC对于M1M2,无需进行任何更改。对于B,您现在还需要删除它的存在ABC。虽然确保在子类AB中同步ABC并不会造成代码维护方面的巨大开销,但我认为这确实表明设计存在问题,尽管 PyCharm 对前一种替代方案发出了警告(我会将其视为误报)。


推荐阅读