Dekorateur, ein Verfahren zu markieren ausgeführt wird nicht mehr als einmal, auch wenn mehrfach aufgerufen

StackOverflow https://stackoverflow.com/questions/1089023

Frage

Ich gehe direkt zum Beispiel:

class Foo:
  @execonce
  def initialize(self):
    print 'Called'

>>> f1 = Foo()
>>> f1.initialize()
Called
>>> f1.initialize()
>>> f2 = Foo()
>>> f2.initialize()
Called
>>> f2.initialize()
>>> 

Ich habe versucht, execonce zu definieren, kann aber nicht eine schreiben, die mit Methoden arbeiten.

PS: Ich kann nicht den Code in __init__ für initialize definieren muss aufgerufen werden irgendwann nach das Objekt initialisiert wird. cf - cmdln Ausgabe 13

War es hilfreich?

Lösung

import functools

def execonce(f):

    @functools.wraps(f)
    def donothing(*a, **k):
        pass

    @functools.wraps(f)
    def doit(self, *a, **k):
        try:
            return f(self, *a, **k)
        finally:
            setattr(self, f.__name__, donothing)

    return doit

Andere Tipps

Sie können etwas tun:

class Foo:
  def __init__(self):
    self.initialize_called = False
  def initialize(self):
    if self.initalize_called:
        return
    self.initialize_called = True
    print 'Called'

Das ist einfach und leicht zu lesen. Es gibt eine andere Instanz-Variable und einige Code in der __init__ Funktion erforderlich, aber es würde Ihre Anforderungen erfüllen.

versuchen, etwas ähnlich wie diese

def foo():
     try:
             foo.called
     except:
             print "called"
             foo.called = True

Methoden und Funktionen sind Objekte. Sie können Methoden und Attribute auf sich. Dies kann für Ihren Fall nützlich sein. Wenn Sie einen Dekorateur will, muss nur der Dekorateur des Verfahrens zuzuteilen aber zuerst die Flagge überprüfen. Wenn das Flag gefunden wird, ein Null-Verfahren zurückgegeben wird, und folglich ausgeführt.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top