Dekorateur, ein Verfahren zu markieren ausgeführt wird nicht mehr als einmal, auch wenn mehrfach aufgerufen
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
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.