[PYTHON] Récupère le nom de la classe où la méthode est définie dans le décorateur

Un mémo quand j'ai eu du mal à obtenir le nom de la classe lors de la journalisation du temps d'exécution de la méthode

Chose que tu veux faire

Je souhaite afficher le nom de la classe et le nom de la méthode lors de la journalisation avec une méthode décorée pour savoir quelle méthode est en cours d'exécution à quelle heure

try1

Contenu de la mise en œuvre

Essayez de décorer normalement

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

Résultat: erreur

func a été passé en tant que fonction et n'avait pas im_class. Par conséquent, je pourrais obtenir le nom de la méthode, mais pas le nom de la classe.

try2

Contenu de la mise en œuvre

Obtenez le nom de la classe de vous-même.

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

Résultat: erreur?

NG car le nom de la sous-classe sera renvoyé lors de l'héritage

try3

Contenu de la mise en œuvre

Décorez la classe.

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__)
            #Processus de journalisation
            return result
        return inner

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

Résultat: OK

Il est comparé à target_func, mais dans la version réellement utilisée, le nom de la méthode cible a été préparé sous forme de taple et comparé. Si vous souhaitez spécifier clairement la méthode cible, vous pouvez également utiliser la méthode suivante.

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__)
            #Processus de journalisation
            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

Récupère le nom de la classe où la méthode est définie dans le décorateur
Obtenez automatiquement le port où Arduino est bloqué en Python
Obtenez le nom d'hôte en Python
Malheureusement, il n'y a pas de sens d'unité dans la méthode where
Obtenir la région dans laquelle AWS Lambda s'exécute
Écrire un décorateur en classe
Comment obtenir le nom de la variable lui-même en python
Obtenir le nom de fichier dans un dossier à l'aide de glob
[python] Récupère la liste des classes définies dans le module
Lorsqu'une variable locale portant le même nom que la variable globale est définie dans la fonction
Comment utiliser la méthode __call__ dans la classe Python
Décorateur qui affiche "Nom de la méthode FIN" à la fin de la méthode
Obtenez le nom de fichier enregistré dans AWS S3 (1000 ou plus)
Je veux obtenir le nom de la fonction / méthode en cours d'exécution
Comment est le progrès? Continuons le boom ?? en Python
Formatez le journal Git et obtenez le nom du fichier validé au format csv
Obtenez le chemin du bureau en Python
Obtenez le chemin du script en Python
Le sexe est déterminé à partir du nom.
Examiner la classe d'un objet avec python
Obtenez le chemin du bureau en Python
Récupérer la chaîne de requête (chaîne de requête) avec Django
Découvrez le nom de la méthode qui l'a appelée à partir de la méthode qui est python
Comment obtenir le "nom" d'un champ dont la valeur est limitée par l'attribut choice dans le modèle Django
[Python] Erreur de nom: le nom'urlparse 'n'est pas défini
Obtenez les nièmes valeurs les plus importantes dans Pandas
[Python] Récupère le nom de la variable avec str
Où est écrit le processus d'instanciation python?
Apprenez le modèle de conception "Décorateur" avec Python
Qu'est-ce que "mahjong" dans la bibliothèque Python? ??
Lorsque la cible est Ubuntu 16.04 dans Ansible
Je ne peux pas obtenir l'élément dans Selenium!
Obtenir la liste de codes EDINET en Python
Y a-t-il NaN dans le DataFrame pandas?
La date n'est pas affichée correctement dans matplotlib.
Je veux obtenir le chemin du répertoire où le fichier en cours d'exécution est stocké.
[pandas] Lors de la spécification de l'étiquette d'index par défaut dans la méthode at, "" n'est pas requis
Erreur d'importation: impossible d'importer le nom 'Flask' lorsque le nom de fichier est flask.py dans Flask
Vous pouvez appeler la méthode de la classe directement dans Python3 sans ajouter @staticmethod
Comment obtenir le nom du bloc-notes que vous utilisez actuellement dans Google Colab
En Python, changez le comportement de la méthode en fonction de la façon dont elle est appelée
Je veux obtenir le nom du fichier, le numéro de ligne et le nom de la fonction dans Python 3.4
Je n'ai pas eu besoin d'écrire décorateur en classe Merci contextmanager