如何继承ABC和另一个类

scr*_*avy 5 python oop inheritance python-3.8

我有课

class A(ABC):
  @abstractmethod
  def m():
    pass
Run Code Online (Sandbox Code Playgroud)

以及一堆继承它的类。

class M1(A):
  ...

class M2(A):
  ...

...
Run Code Online (Sandbox Code Playgroud)

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


       A
       |
  +----+----+
  |    |    |
  M1   M2   B
            |
         +--+--+
         |     |
         K1   K2
Run Code Online (Sandbox Code Playgroud)

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

我使用的是Python 3.8

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

Ami*_*ory 2

你可以简单地使用

class B(A):
   pass
Run Code Online (Sandbox Code Playgroud)

或所有孩子都通用的任何其他代码,但没有m. 由于缺少 . 这仍然是抽象的m


另一种方法是使用

class B(A, ABC):
   pass
Run Code Online (Sandbox Code Playgroud)

在我看来,这不太好。这表明B既是 anA又是 an ABC,而前一个替代项表明B是 an A,并且就其自身ABC而言,它是一个。AABC

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