我想写所有非魔法方法的类修饰器来装饰这些方法。这个想法是,所有类的方法在打电话后打印它的名字;我不想装饰所有的方法,但只有阶级。装饰者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'的返回值,它根本不影响类。 –