我想寫所有非魔法方法的類修飾器來裝飾這些方法。這個想法是,所有類的方法在打電話後打印它的名字;我不想裝飾所有的方法,但只有階級。裝飾者log_method
的作品。我有問題log_class
裝飾。沒有錯誤,也沒有輸出。修飾所有方法的類的裝飾器
import traceback
import inspect
def log_method(func):
def inner(*args, **kwargs):
print("{}{}".format(int(len(traceback.extract_stack())/2) * " ", func.__name__))
return func(*args, **kwargs)
return inner
def log_class(cls):
for m in dir(cls):
if not m.startswith("__") and inspect.isfunction(getattr(cls, m)):
m = log_method(m)
print(m)
return cls
@log_class
class Cls:
def __init__(self):
pass
def A(self):
self.B()
def B(self):
self.C()
def C(self):
pass
Cls().A()
"""
Excepted output:
A
B
C
"""
'm = log_method(m)'只是給變量'm'賦值'log_method'的返回值,它根本不影響類。 –