Besseren Weg, um log-Methode, ruft Python?
Können wir code, eine Art von Protokollierung Dekorator echo-Funktion/- Methode aufrufen wie dem folgenden:
def log(fn):
...
@log
def foo():
...
class Foo(object):
@log
def foo(self):
...
@log
def bar(self, a, b):
...
@log
def foobar(self, x, y, z):
...
Aber was ist, wenn wir sind wie log-Methode aufruft, ohne dass viele @ - log-in vor jeder meth-definition? Gibt es eine Möglichkeit, nur ein Dekorator oben genannten definition einer Klasse machen alle Ihre Methodenaufrufe eingerichtet/angemeldet? Oder gibt es andere besser und interessanter Weise zu tun, anstatt decorator?
- Würde es nicht mehr Sinn machen, explizit melden Sie Sachen? Ich verstehe, dass die logging-Funktion können Gespräche hilfreich sein, um eine bessere Vorstellung, was passiert, wenn, aber in der Regel, zumindest würde ich es vorziehen, um einige der Protokollierung in zwischen, wenn es angemessen erscheint.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sehen Anbringen eines Dekorators auf alle Funktionen innerhalb einer Klasse
Jedoch, wie die akzeptierte Antwort auf diese Frage weist darauf hin, es in der Regel nicht eine gute Idee.
Wenn Sie sich entscheiden, um die Aspekt orientierte Programmierung route, ich schlage vor, beginnend hier: Jede AOP-support-Bibliothek für Python?
Dies ist möglicherweise übertrieben, aber es ist eine trace-Funktion, Einrichtung, informieren Sie über ein großes Angebot von Aktivitäten in Ihrem Programm:
Ich bin mir nicht sicher, was für Ihren Fall ist, aber allgemein würde ich mehr darüber nachdenken, was genau ist das problem, das Sie versuchen zu lösen.
Dieser sagte, hier ist ein Beispiel, das tun könnten, was Sie wollen, aber ohne einen decorator:
Ausgabe:
__getattr__
wird NICHT aufgerufen werden, wenn die Attribute existieren, mit normalen look-up-Methoden, die__getattribute__
. Dies ist der Grund, warum ich überschrieb__getattribute__
NICHT__getattr__
. Sie könnte haben zumindest den code ausführen, bevor Sie bearbeitet wurde 🙂Gut, Wenn Sie nicht explizit zu schmücken alle Ihre Funktionen, Sie können alle die Funktionen/Methoden, die von einem bestimmten Modul und wenden Sie Ihr Dekorateur automatisch. nicht die einfachste Sache, aber nicht unmöglich in python 🙂
Können Sie auch versuchen, ein aspect-oriented programming framework.
my2c