[PYTHON] Rufen Sie den Klassennamen ab, in dem die Methode im Dekorator definiert ist

Ein Memo, in dem es mir schwerfiel, den Klassennamen zu ermitteln, als ich die Ausführungszeit der Methode protokollierte

Was du machen willst

Ich möchte den Klassennamen und den Methodennamen beim Protokollieren mit einer dekorierten Methode anzeigen, um herauszufinden, welche Methode zu welcher Zeit ausgeführt wird

try1

Implementierungsinhalt

Versuchen Sie normal zu dekorieren

def deco(func):
    def inner(self, *args, **kwargs):
        result = func(self, *args, **kwargs)
        print 'class: %s, method: %s' % (
            func.im_class.__name__,
            func.__name__)
        #Protokollierungsprozess
        return result
    return inner

Ergebnis: Fehler

func wurde als Funktion übergeben und hatte keine im_class. Daher konnte ich den Methodennamen erhalten, aber nicht den Klassennamen.

try2

Implementierungsinhalt

Holen Sie sich den Klassennamen von self.

def deco(func):
    def inner(self, *args, **kwargs):
        result = func(self, *args, **kwargs)
        print 'class: %s, method: %s' % (
            self.__class__.__name__,
            func.__name__)
        #Protokollierungsprozess
        return result
    return inner

Ergebnis: Fehler?

NG, da der Name der Unterklasse beim Erben zurückgegeben wird

try3

Implementierungsinhalt

Dekoriere die Klasse.

def deco_cls(cls):
    def deco_method(func):
        def inner(self, *args, **kwargs):
            result = func(self, *args, **kwargs)
            print 'class: %s, method: %s' % (
                cls.__name__,
                func.__name__)
            #Protokollierungsprozess
            return result
        return inner

    for name, method in cls.__dict__.items():
        if name == 'target_func':
            setattr(cls, name, deco_method(method))
    return cls

Ergebnis: OK

Es wird als target_func verglichen, aber in der tatsächlich verwendeten Version wurde der Name der Zielmethode als Taple vorbereitet und verglichen. Wenn Sie die Zielmethode klar angeben möchten, können Sie auch die folgende Methode verwenden.

def deco_cls(cls):
    def deco_method(func):
        def inner(self, *args, **kwargs):
            result = func(self, *args, **kwargs)
            print 'class: %s, method: %s' % (
                cls.__name__,
                func.__name__)
            #Protokollierungsprozess
            return result
        return inner

    for name, method in cls.__dict__.items():
        if hasattr(method, 'set_logger'):
            setattr(cls, name, deco_method(method))
    return cls

def set_logger_wrapper(func):
    func.set_logger = True
    return func

Recommended Posts

Rufen Sie den Klassennamen ab, in dem die Methode im Dekorator definiert ist
Holen Sie sich automatisch den Port, an dem Arduino in Python steckt
Holen Sie sich den Hostnamen in Python
Leider gibt es kein Gefühl der Einheit in der where-Methode
Holen Sie sich die Region, in der AWS Lambda ausgeführt wird
Schreiben Sie Dekorateur in der Klasse
So erhalten Sie den Variablennamen selbst in Python
Abrufen des Dateinamens in einem Ordner mithilfe von glob
[Python] Ruft die Liste der im Modul definierten Klassen ab
Wenn eine lokale Variable mit demselben Namen wie die globale Variable in der Funktion definiert ist
Verwendung der Methode __call__ in der Python-Klasse
Dekorateur, der am Ende der Methode "FIN-Methodenname" anzeigt
Holen Sie sich den in AWS S3 gespeicherten Dateinamen (1000 oder mehr)
Ich möchte den Namen der ausgeführten Funktion / Methode erhalten
Wie ist der Fortschritt? Lassen Sie uns mit dem Boom in Python weitermachen
Formatieren Sie das Git-Protokoll und erhalten Sie den festgeschriebenen Dateinamen im CSV-Format
Holen Sie sich den Desktop-Pfad in Python
Holen Sie sich den Skriptpfad in Python
Das Geschlecht wird aus dem Namen bestimmt.
Untersuchen Sie die Klasse eines Objekts mit Python
Holen Sie sich den Desktop-Pfad in Python
Holen Sie sich die Abfragezeichenfolge (Abfragezeichenfolge) mit Django
Den Namen der Methode, die ihn aufgerufen hat, finden Sie in der Python-Methode
So erhalten Sie den "Namen" eines Feldes, dessen Wert durch das Auswahlattribut im Django-Modell begrenzt ist
[Python] Namensfehler: name'urlparse 'ist nicht definiert
Holen Sie sich die besten n-ten Werte in Pandas
[Python] Ruft den Variablennamen mit str ab
Wo ist der Python-Instanziierungsprozess geschrieben?
Lernen Sie das Designmuster "Decorator" mit Python
Was ist "Mahjong" in der Python-Bibliothek? ??
Wenn das Ziel Ubuntu 16.04 in Ansible ist
Ich kann das Element in Selen nicht bekommen!
Ruft die EDINET-Codeliste in Python ab
Gibt es NaN im Pandas DataFrame?
Das Datum wird in matplotlib falsch angezeigt.
Ich möchte den Pfad des Verzeichnisses abrufen, in dem die laufende Datei gespeichert ist.
[pandas] Wenn Sie die Standardindexbezeichnung in der at-Methode angeben, ist "" nicht erforderlich
Importfehler: Der Name'Flask 'kann nicht importiert werden, wenn der Dateiname in Flask flask.py lautet
Sie können die Methode der Klasse direkt in Python3 aufrufen, ohne @staticmethod hinzuzufügen
So erhalten Sie den Notebook-Namen, den Sie derzeit in Google Colab verwenden
Ändern Sie in Python das Verhalten der Methode je nach Aufruf
Ich möchte den Dateinamen, die Zeilennummer und den Funktionsnamen in Python 3.4 erhalten
Ich musste im Unterricht keinen Dekorateur schreiben. Danke Kontextmanager