2017-09-09 93 views
0

我只在这个特定的模块中有一个抽象类,所以我试图避免导入“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 
+0

一般来说,使同名的类属性和基类方法似乎是错误的。一种是一种方法,一种是“dict”,它不是“可调用的”。 – JacobIRR

+0

@JacobIRR当然,我同意......有没有另外一种方法可以强制添加特定的属性,而不管它的实现如何? – ThatTechGuy

回答

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未被子类实现,则会引发未实现的错误。

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

+0

够公平的,我会保持二传手还是不需要它?我把它包括在内,因为财产只有在没有它的情况下才会被阅 – ThatTechGuy

+0

刚刚尝试过......在这种情况下,我实际上得到了递归错误,它试图“一遍又一遍地获得需求” {File /第11行,在要求 返回self.requirements RuntimeError:最大递归深度超出} – ThatTechGuy

+0

在那里,我实际上有这个问题,需要确保名称空间实际上是不同的,所以它不会不断返回到自己...谢谢! – ThatTechGuy