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
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
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
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
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
NG car le nom de la sous-classe sera renvoyé lors de l'héritage
try3
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
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