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 必须继承所有抽象方法”
你可以简单地使用
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最终的情况。对于M1和M2,无需进行任何更改。对于B,您现在还需要删除它的 an ABC。虽然确保A和B在子类化中同步在ABC代码维护方面并不是一个巨大的开销,但我认为这确实表明设计是有问题的,尽管 PyCharm 对前一种替代方案发出了警告(我会将其视为误报)。
| 归档时间: |
|
| 查看次数: |
2873 次 |
| 最近记录: |