【问题标题】:defining or automatically setting required fields for a type of class为一类类型定义或自动设置必填字段
【发布时间】: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


【解决方案1】:

我认为 beeing 明确并调用 super 可能是最好的方法。 但您也可以考虑在 Parent 类中使用属​​性:

class Parent(object):

    def process(self):
        try:
            self.run()
        except Exception, e:
            assert self.status == 'ok'

    def get_status(self):
        try:
            return self._status
        except AttributeError:
            print "oops: child class did not initialize status"
            return "ok"

    def set_status(self, status):
        self._status = status

    status = property(get_status, set_status)

class BadChild(Parent):
    def run(self):
        print "run bad"
        self.status

class GoodChild(Parent):

    def __init__(self):
        self.status = "ok"

    def run(self):
        print "run good"
        self.status

还有测试:

bad = BadChild()
good = GoodChild()

good.process()
bad.process()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-09-17
    • 2011-07-04
    • 2012-11-27
    • 1970-01-01
    • 2023-03-08
    • 2019-06-12
    • 2020-02-25
    • 1970-01-01
    相关资源
    最近更新 更多