Würde so etwas tun, was Sie brauchen?
class Test(object):
def _decorator(foo):
def magic( self ) :
print "start magic"
foo( self )
print "end magic"
return magic
@_decorator
def bar( self ) :
print "normal call"
test = Test()
test.bar()
Dies vermeidet den Aufruf von self, auf den Dekorator zuzugreifen, und lässt ihn als reguläre Methode im Klassennamensraum verborgen.
>>> import stackoverflow
>>> test = stackoverflow.Test()
>>> test.bar()
start magic
normal call
end magic
>>>
bearbeitet, um Frage in Kommentaren zu beantworten:
Wie man den versteckten Dekorateur in einer anderen Klasse benutzt
class Test(object):
def _decorator(foo):
def magic( self ) :
print "start magic"
foo( self )
print "end magic"
return magic
@_decorator
def bar( self ) :
print "normal call"
_decorator = staticmethod( _decorator )
class TestB( Test ):
@Test._decorator
def bar( self ):
print "override bar in"
super( TestB, self ).bar()
print "override bar out"
print "Normal:"
test = Test()
test.bar()
print
print "Inherited:"
b = TestB()
b.bar()
print
Ausgabe:
Normal:
start magic
normal call
end magic
Inherited:
start magic
override bar in
start magic
normal call
end magic
override bar out
end magic
Was Sie tun möchten, ist nicht möglich. Nehmen Sie zum Beispiel an, ob der folgende Code gültig aussieht oder nicht:
Es ist natürlich nicht gültig, da
self
es zu diesem Zeitpunkt noch nicht definiert ist. Das Gleiche gilt,Test
da es erst definiert wird, wenn die Klasse selbst definiert ist (die gerade bearbeitet wird). Ich zeige Ihnen dieses Code-Snippet, weil sich Ihr Dekorator-Snippet in dieses verwandelt.Wie Sie sehen, ist der Zugriff auf die Instanz in einem solchen Dekorator nicht wirklich möglich, da Dekoratoren während der Definition der Funktion / Methode angewendet werden, mit der sie verbunden sind, und nicht während der Instanziierung.
Wenn Sie Zugriff auf Klassenebene benötigen , versuchen Sie Folgendes:
quelle
quelle
@foo
nicht sein@foo()
wrapper
seinself
?Ich verwende diese Art von Dekorator in einigen Debugging-Situationen. Sie ermöglicht das Überschreiben von Klasseneigenschaften durch Dekorieren, ohne dass die aufrufende Funktion gefunden werden muss.
Hier ist der Dekorationscode
Hinweis: Da ich einen Klassendekorator verwendet habe, müssen Sie @adecorator () mit den Klammern verwenden , um Funktionen zu dekorieren, auch wenn Sie dem Klassenkonstruktor des Dekorators keine Argumente übergeben.
quelle
Dies ist eine Möglichkeit,
self
von innerhalb einerdecorator
definierten Klasse auf dieselbe Klasse zuzugreifen (und diese verwendet zu haben) :Ausgabe (getestet am
Python 2.7.10
):Das obige Beispiel ist albern, aber es funktioniert.
quelle
Ich habe diese Frage gefunden, als ich ein sehr ähnliches Problem untersucht habe. Meine Lösung besteht darin, das Problem in zwei Teile aufzuteilen. Zunächst müssen Sie die Daten erfassen, die Sie den Klassenmethoden zuordnen möchten. In diesem Fall ordnet handler_for dem Handler einen Unix-Befehl für die Ausgabe dieses Befehls zu.
Nachdem wir jeder Klassenmethode einige Daten zugeordnet haben, müssen wir diese Daten sammeln und in einem Klassenattribut speichern.
quelle
Hier ist eine Erweiterung der Antwort von Michael Speer, um noch ein paar Schritte weiter zu gehen:
Ein Instanzmethoden-Dekorator, der Argumente akzeptiert und auf eine Funktion mit Argumenten und einem Rückgabewert einwirkt.
Und dann
quelle
Dekorateure scheinen besser geeignet zu sein, die Funktionalität eines gesamten Objekts (einschließlich Funktionsobjekte) im Vergleich zur Funktionalität einer Objektmethode zu ändern , die im Allgemeinen von Instanzattributen abhängt. Beispielsweise:
Die Ausgabe ist:
quelle
Sie können den Dekorateur dekorieren:
quelle
Ich habe eine Implementierung von Dekorateuren, die helfen könnten
quelle
Erklären Sie in der inneren Klasse. Diese Lösung ist ziemlich solide und wird empfohlen.
Das Ergebnis:
quelle