2017-09-09 2 views
0

Je n'aurai qu'une seule classe abstraite dans ce module particulier et j'essaie donc d'éviter d'importer le paquet "ABC". Voir ci-dessous pour ma tentative et le problème que je rencontre. Je veux seulement utiliser l'affectation de base self.attribute = {etc...} dans la méthode __init__ de la sous-classe, mais je veux m'assurer que cela est fait via la classe AbstractClass. Je l'ai vu quelques questions ici, mais toutes les réponses référence paquet « ABC » que je suis d'accord est la meilleure solution, mais pas pour simplement une classe dans tout un programme ...Attribut abstrait 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 

Dans l'exemple ci-dessus, je reçois l'erreur suivante lorsque vous tentez d'accéder à l'attribut lors de l'exécution:

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

En général, il semble erroné de créer à la fois un attribut de classe et une méthode de classe de base portant le même nom. L'une est une méthode et l'autre est un 'dict', qui n'est pas 'callable'. – JacobIRR

+0

@JacobIRR Bien sûr, je suis d'accord ... y a-t-il un autre moyen de renforcer l'ajout d'un attribut particulier quelle que soit sa mise en œuvre? – ThatTechGuy

Répondre

1

Vous vous attendez à chaque classe d'enfant d'avoir self.requirements droit? Alors changez le code suivant à ceci.

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

De cette façon, il renverra des exigences personnelles. Si self.requirements n'a pas été implémenté par la classe enfant, il déclenchera une erreur non implémentée.

EDIT: retour mis à jour pour éviter les boucles interminables.

+0

Assez juste, est-ce que je garderais le setter tel quel ou je n'en ai pas besoin? Je l'ai inclus parce que la propriété devenait lecture seulement sans elle. – ThatTechGuy

+0

Juste essayé ... Je reçois en fait une erreur de récursivité dans ce cas, il essaie de "obtenir les exigences encore et encore" {File "/Users/rickmartin/Dropbox/Projects/DrugRunner/drapi/event.py", runtimeError: la profondeur de récursivité maximale est dépassée} – ThatTechGuy

+0

Nous y sommes allés, j'ai eu ce problème plus tôt, je dois m'assurer que l'espace de noms est vraiment différent pour qu'il ne revienne pas continuellement à lui-même ... Merci! – ThatTechGuy