2017-09-09 13 views
0

このモジュールでは抽象クラスが1つしかないため、「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

一般に、クラス属性とベースクラスの両方のメソッドを同じ名前にするのは間違っているようです。 1つはメソッドであり、1つは 'dict'です。これは' callable'ではありません。 – 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が子クラスによって実装されていない場合、実装されていないエラーが発生します。

EDIT:終わりのないループを避けるためにリターンが更新されました。

+0

十分に十分ですが、私はセッターをそのまま保つか、それとも必要ありませんか?私はその物件がそれなしで読まれるようになったので、それを含めました。 – ThatTechGuy

+0

ちょうど試しました...私は実際にこの場合再帰エラーを取得しますが、それは "何度も何度も要求を取得しようとしています" {ファイル "/Users/rickmartin/Dropbox/Projects/DrugRunner/drapi/event.py" 11行目、要件内 return self.requirements RuntimeError:最大再帰深度を超えました} – ThatTechGuy

+0

私は実際にこの問題を以前に持っていましたが、名前空間が実際は異なっていることを保証する必要があるため、ありがとう! – ThatTechGuy

関連する問題