2016-03-30 8 views
1
class car(object): 
    def read_spec_and_populate_db(): 
     spec = read_from_file(spec.yaml) 
     populate_db(spec) 

class awd(car): 
    super(awd, self).read_spec_and_populate_db() 

    def foo(self): 
    ... 

class fwd(car): 
    super(fwd, self).read_spec_and_populate_db() 

    def bar(self): 
    ... 

Klasse awd und fwd können zu unterschiedlichen Zeiten instanziiert werden oder nur einer von ihnen kann instanziiert ausgeführt werden soll. Gibt es nun eine Möglichkeit, die Basisklassenmethode read_spec_and_populate_db() so einzuschränken, dass sie nur einmal ausgeführt wird?Wie Basisklassenmethode beschränken nur einmal

Ich habe in SO gesucht und here gefunden. Wollte sehen, ob es andere Möglichkeiten gibt.

Edit: Nicht, dass ich dagegen bin. Ich suche nach Ideen abgesehen von der Verwendung einer Flagge. Meine aktuelle Implementierung verwendet ein Flag in der Klasse.

Antwort

2

Verwenden Sie einfach eine Flagge:

class car(object): 
    db_read = False 
    def read_spec_and_populate_db(): 
     if not car.db_read: 
      spec = read_from_file(spec.yaml) 
      populate_db(spec) 
      car.db_read = True 

Jetzt können Sie read_spec_and_populate_db() so oft wie Sie wollen nennen. Es macht seine Arbeit nur einmal.

+0

und zu erklären: Sie werden verfolgen, haben irgendwie „es gelesen wurde“, und ein Flag ist ein vollkommen klar Weg genau das zu kommunizieren. Mach keine magischen Sachen nur für die Magie. – MatsLindh

+0

das ist in Ordnung, außer dass eine Klassenmethode sauberer IMO ist, nein? Wenn ja, aktualisieren Sie Ihre Antwort und ich werde meine löschen. Ich habe bereits Ihre hochgeladen –

+0

Eine Klassenmethode funktioniert nicht mit Vererbung. Wenn Sie eine Instanz von 'awk' erstellen, wird zuerst 'awk.populated = True' erstellt. Dann, wenn Sie eine Instanz von "Auto" machen, ist "car.populated" immer noch falsch und die Spezifikationen werden ein zweites Mal gelesen. –

0

können Sie einen Booleschen Klasse Attribut Flag verwenden, um zu verfolgen, ob die Methode bereits oder nicht ausgeführt wurde, etwa so:

class Car(object): 
    _populated_db = False 

    def read_spec_and_populate_db(self): 
     if not self._populated_db: 
      spec = read_from_file(spec.yaml) 
      populate_db(spec) 
      self._populated_db = True 
+0

Nur aus Interesse, haben Sie deswegen downvote? – s16h

+0

ja, weil ich nicht den Punkt sehe, zweimal die gleiche Antwort zu haben. –

-1

Ein Gedanke könnte den Namen read_spec_and_populate_db, als letzten Schritt werden die Neuzuweisung in seine Ausführung, mit der gleichen Signatur auf ein Verfahren zum Punkt tut aber nichts

class car(object): 
    def _dummy(self): 
     pass 

    def read_spec_and_populate_db(self): 
     spec = read_from_file(spec.yaml) 
     populate_db(spec) 

     self.read_spec_and_populate_db = self._dummy