2017-09-09 192 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