class ABC
是一个“抽象基类”。class X
是它的子类。
在 的任何子类中都需要完成一些工作ABC
,这很容易忘记或做错。我想ABC.__init__()
通过以下方式帮助捕捉此类错误:
(1) 开始这项工作,或 (2) 验证它
这会影响super().__init__()
是在开始还是结束时调用X.__init__()
。
这是一个用于说明目的的简化示例:
假设每个子类都ABC
必须有一个属性registry
,并且它必须是一个列表。ABC.__init__()
可以(1)初始化registry
或(2)检查它是否被正确创建。以下是每种方法的示例代码。
方法一:在ABC中初始化
class ABC:
def __init__(self):
self.registry = []
class X:
def __init__(self):
super().__init__()
# populate self.registry here
...
方法 2:在 ABC 中验证
class ABC:
class InitializationFailure(Exception):
pass
def __init__(self):
try:
if not isinstance(self.registry, list):
raise ABC.InitializationError()
except AttributeError:
raise ABC.InitializationError()
class X:
def __init__(self):
self.registry = []
# populate self.registry here
...
super().__init__()
哪个设计更好?