【发布时间】:2016-04-11 19:17:21
【问题描述】:
我有一系列派生类“ChildA”、“ChildB”等……它们都继承自基类“Parent”。
Parent 的目的是实现在 Child 类中执行代码的通用方法。此方法内部是基于子实例的“状态”的条件。
class Parent:
def process(self):
try:
self.run()
except:
assert self.status == 'ok'
class ChildA(Parent):
def run(self):
...
我想让未来的开发者子类免于令人不快的意外。
我觉得解决方案将以 AbstractClass 的形式出现,但我还没有(完全)掌握这个概念。或者更确切地说,我明白了这个概念,但不知道如何应用它。
否则我可以:
- 在文档中指定“状态”字段的要求。
- 我更喜欢严格而有机的执法手段。
- 将
__init__(self): self.status = None添加到父级,并要求(再次通过文档),所有子类都可以使用 super() 调用 Parent 的 init 函数。- 对于只初始化一个字段的 Base init 方法看起来过于复杂,但如果这是 Pythonic 的方式,则愿意使用它。
- 检查 Parent.process() 开头的 .status 字段
- 一行行完成,但太老套了。
你有什么推荐的?
运行 Python 3.5
【问题讨论】:
-
“正确”的解决方案始终取决于具体的用例和目标受众 - 但在所有情况下,您都希望清楚地记录您的 API 以及对子类的期望。
-
一件非常错误的事情是使用了不加区别的
except子句:始终指定您期望的错误 - 或至少记录您遇到的任何错误。跨度> -
值得注意!实际的代码行是
except (KeyError, IndexError) as e:。
标签: python class oop abstract-class subclass