我在这个特定模块中只有一个抽象类,所以我试图避免导入" 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
答案 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,则会引发未实现的错误。
编辑:更新了返回以避免永无止境的循环。