Ein Memo, in dem es mir schwerfiel, den Klassennamen zu ermitteln, als ich die Ausführungszeit der Methode protokollierte
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
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
func wurde als Funktion übergeben und hatte keine im_class. Daher konnte ich den Methodennamen erhalten, aber nicht den Klassennamen.
try2
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
NG, da der Name der Unterklasse beim Erben zurückgegeben wird
try3
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
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