为一类类定义或自动设置必填字段

时间:2016-01-07 11:52:49

标签: python class oop abstract-class subclass

我有一系列派生类" ChildA"," ChildB"等等...都继承自Base类" Parent"。

Parent的目的是实现在Child类中执行代码的通用方法。在此方法内部是基于子实例的状态'的条件。

class Parent:
    def process(self):
        try:
            self.run()
        except:
            assert self.status == 'ok'

class ChildA(Parent):
    def run(self):
        ...

我希望保存未来的开发人员Child类免于令人不快的意外。

我觉得解决方案会以AbstractClass的形式出现,但我还没有(完全)掌握这个概念。或者说,我得到的概念,但不是如何应用它。

否则我可以:

  • 指定“状态”的要求' doc中的字段。
    • 我更喜欢严格的有机执法手段。
  • __init__(self): self.status = None添加到Parent,并要求(再次通过文档),使用所有Child类 super()调用Parent的init函数。
    • 看起来过于复杂,只能初始化一个字段的Base init方法,但如果这是Pythonic的方法,那么愿意使用它。
  • 检查Parent.process()开头的.status字段
    • 这项工作是否在一条线上,但太过于hacky。

你推荐什么?

运行Python 3.5

1 个答案:

答案 0 :(得分:0)

我认为明确而且召唤超级可能是最好的方式。 但您也可以考虑在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()