代码之家  ›  专栏  ›  技术社区  ›  ThatTechGuy

Python抽象属性

  •  1
  • ThatTechGuy  · 技术社区  · 8 年前

    在这个特定的模块中,我只有一个抽象类,所以我尽量避免导入“ABC”包。下面是我的尝试和遇到的问题。我只想用basic 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
    
    1 回复  |  直到 8 年前
        1
  •  1
  •   ThatTechGuy    8 年前

    self.requirements 正当所以把下面的代码改成这个。

    class Event(object):
        @property
        def requirements(self):
            try:
                return self._requirements
            except AttributeError:
                raise NotImplementedError('subclasses must have requirements')
    

    这样它就会回归自我。要求。如果是自己。子类尚未实现需求,它将引发未实现错误。