Python抽象属性
我只在这个特定的模块中有一个抽象类,所以我试图避免导入“ABC”包。请参阅下面的我的尝试和我遇到的问题。我只想在子类的__init__
方法中使用基本的self.attribute = {etc...}
赋值,但我想确保它通过AbstractClass完成。我看到这里的一些问题,但答案都参考“ABC”包,我同意是最好的解决办法,但不是在整个程序只是一个类...Python抽象属性
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
你希望每个子类有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未被子类实现,则会引发未实现的错误。
编辑:更新回报,以避免永无止境的循环。
够公平的,我会保持二传手还是不需要它?我把它包括在内,因为财产只有在没有它的情况下才会被阅 – ThatTechGuy
刚刚尝试过......在这种情况下,我实际上得到了递归错误,它试图“一遍又一遍地获得需求” {File /第11行,在要求 返回self.requirements RuntimeError:最大递归深度超出} – ThatTechGuy
在那里,我实际上有这个问题,需要确保名称空间实际上是不同的,所以它不会不断返回到自己...谢谢! – ThatTechGuy
一般来说,使同名的类属性和基类方法似乎是错误的。一种是一种方法,一种是“dict”,它不是“可调用的”。 – JacobIRR
@JacobIRR当然,我同意......有没有另外一种方法可以强制添加特定的属性,而不管它的实现如何? – ThatTechGuy