Kann ein Python-Decorator einer Instanzmethode auf die Klasse zugreifen?
Hallo ich habe etwas in etwa wie das folgende. Im Prinzip brauche ich, um Zugriff auf die Klasse einer Instanz-Methode von einem Dekorator verwendet, die auf die Instanz-Methode, die in Ihrer definition.
def decorator(view):
# do something that requires view's class
print view.im_class
return view
class ModelA(object):
@decorator
def a_method(self):
# do some stuff
pass
Den code wie Sie ist gibt
AttributeError: 'function' object has no attribute 'im_class'
Fand ich ähnliche Frage/Antworten - Python-decorator macht die Funktion vergessen, dass es gehört zu einer Klasse und Holen Sie sich Klasse in Python-decorator -, aber diese beruhen auf einen workaround, der packt die Instanz zur Laufzeit, indem er schnappte sich den ersten parameter. In meinem Fall werde ich den Aufruf der Methode basierend auf den gewonnenen Informationen aus seiner Klasse, so dass ich kann nicht warten, auf einen Anruf zu kommen.
Danke.
InformationsquelleAutor der Frage Carl G | 2010-03-02
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie mit Python 2.6 oder höher, könnten Sie eine Klasse decorator, vielleicht so etwas wie dieses (Achtung: ungetestet-code).
Die Methode Dekorator markiert die Methode als eine, die von Interesse sind, indem ein "use_class" - Attribut- Funktionen und-Methoden sind auch Objekte, so können Sie zusätzliche Metadaten.
Nachdem die Klasse erstellt wurde die Klasse decorator geht dann durch alle Methoden und tut, was erforderlich ist, auf die Methoden, die markiert wurden.
Wenn Sie möchten, dass alle Methoden betroffen, dann könnte man weglassen und die Methode Dekorateur und verwenden nur die Klasse decorator.
InformationsquelleAutor der Antwort Dave Kirby
Als andere haben darauf hingewiesen, daß die Klasse wurde noch nicht erstellt an der Zeit, die der Dekorator aufgerufen wird. Jedoches ist möglich, mit dem function-Objekt wird mit dem Symbol-Parameter, dann re-schmücken die Funktion in der Metaklasse ist
__new__
Methode. Sie müssen Zugriff auf die Funktion__dict__
Attribut direkt, als-zumindest für mich -func.foo = 1
führte zu einem AttributeError.InformationsquelleAutor der Antwort Mark Visser
Als Ameisen angegeben, können Sie nicht bekommen eine Referenz auf die Klasse innerhalb der Klasse. Allerdings, wenn Sie interessiert sind bei der Unterscheidung zwischen verschiedenen Klassen ( nicht die Manipulation der eigentlichen Klasse Typ object), können Sie eine Zeichenfolge übergeben, die für jede Klasse. Sie kann auch passieren, was anderen Parameter, die Sie wie die an den Dekorator mit Klasse-style-Dekorator.
Drucke:
Auch, siehe Bruce Eckel ' s Seite über Dekoratoren.
InformationsquelleAutor der Antwort Ross Rogers
Das problem ist, dass wenn der Dekorator aufgerufen wird die Klasse noch nicht existiert. Versuchen Sie dies:
Dieses Programm erzeugt folgende Ausgabe:
Wie Sie sehen, sind Sie gehen zu müssen, um herauszufinden, einen anderen Weg, das zu tun, was Sie wollen.
InformationsquelleAutor der Antwort Ants Aasma
Hier ein einfaches Beispiel:
Ausgabe:
InformationsquelleAutor der Antwort nicodjimenez
Was Kolben-Edel tut, ist erstellen Sie einen temporären cache, speichert es auf die Methode, dann wird etwas anderes (die Tatsache, dass die Kolben zu registrieren, wird die Klassen mit einem
register
Klasse Methode) tatsächlich wickelt sich die Methode.Können Sie wiederverwenden, dieses Muster, dieses mal mit einer Metaklasse, so dass Sie wickeln die Methode beim import.
Auf die eigentliche Klasse (Sie könnte das gleiche tun mit einer Metaklasse):
Quelle: https://github.com/apiguy/flask-classy/blob/master/flask_classy.py
InformationsquelleAutor der Antwort charlax
Dies ist eine alte Frage, aber kam in Venus. http://venusian.readthedocs.org/en/latest/
Scheint es haben die Fähigkeit, um Methoden zu ergänzen und geben Ihnen Zugriff auf die Klasse und die Methode dabei.
Hinweis tht aufrufen
setattr(ob, wrapped.__name__, decorated)
ist nicht die typische Art und Weise der Verwendung von Venus und irgendwie Niederlagen der Zweck.So oder so... das Beispiel unten vollständig ist und ausgeführt werden soll.
InformationsquelleAutor der Antwort eric.frederich
Funktion weiß nicht, ob es eine Methode bei der Bestimmung Punkt, wenn das decorator-code ausgeführt wird. Nur wenn der Zugriff über die Klasse/Instanz-id kann es wissen, seine Klasse/Instanz. Um diese Beschränkung zu überwinden, können Sie dekorieren, indem Sie descriptor Objekt um die tatsächliche Verzögerung Deko-code bis der Zugriff/Aufruf-Zeit:
Dies ermöglicht es Ihnen, zu schmücken einzelne (statische|Klasse) Methoden:
Nun können Sie die Dekorator-code für die Introspektion...
...und für wechselnde Verhalten der Funktion:
InformationsquelleAutor der Antwort aurzenligl
Haben Sie Zugriff auf die Klasse des Objekts, auf dem die Methode aufgerufen wird, in die dekorierte Methode, die der Dekorator zurückkehren sollte. Etwa so:
Mit Ihrem ModelA-Klasse, hier ist, was dieser tut:
InformationsquelleAutor der Antwort Will McCutchen
Wie Mark schon sagt:
Dieser code zeigt, wie dies funktioniert über die automatische post-processing:
Die Ausgabe ergibt:
Beachten Sie, dass in diesem Beispiel:
Hoffe, das hilft
InformationsquelleAutor der Antwort asterio gonzalez