【发布时间】:2011-07-05 05:34:04
【问题描述】:
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__()
哪个设计更好?
【问题讨论】:
标签: python oop abstract-class software-design