Python抽象属性

时间:2017-09-09 17:00:04

标签: python properties abstract-class

我在这个特定模块中只有一个抽象类,所以我试图避免导入" ABC"包。请参阅下面的我的尝试和我遇到的问题。我只想在子类的self.attribute = {etc...}方法中使用基本__init__赋值,但我想确保它是通过AbstractClass完成的。我在这里看到了一些问题,但答案都是参考" ABC"我同意的包是最好的解决方案,但不是整个程序中只有一个类......

from .util import EventType, NpcType


class Event(object):
    @property
    def requirements(self):
        raise NotImplementedError('subclasses must have requirements')

    @requirements.setter
    def requirements(self, value):
        pass

    def stage(self):
        raise NotImplementedError('subclasses must override stage()')


class NRMSAL(Event):
    def __init__(self):
        self.requirements = {
            'npc_type': [NpcType.TRAPPER],
            'last_event': [],
            'cash_available': False,
            'item_available': True
        }

    def stage(self):
        pass

在上面的示例中,尝试在运行时访问该属性时收到以下错误:

from drapi.event import NRMSAL
test = NRMSAL()
print test.requirements
Traceback (most recent call last):
  File "<input>", line 1, in <module>
  File "/Users/rickmartin/Dropbox/Projects/NpcProject/drapi/event.py", line 7, in requirements
    raise NotImplementedError('subclasses must have requirements')
NotImplementedError: subclasses must have requirements

1 个答案:

答案 0 :(得分:1)

您期望每个孩子班级都有self.requirements吗?因此,请将以下代码更改为此。

class Event(object):
    @property
    def requirements(self):
        try:
            return self._requirements
        except AttributeError:
            raise NotImplementedError('subclasses must have requirements')

这样它将返回self.requirements。如果子类未实现self.requirements,则会引发未实现的错误。

编辑:更新了返回以避免永无止境的循环。