先贴上装饰器的详解,装饰器详解,这个总结很清楚,但有个理解的过程,记录下
- 写类和方法,并执行
class decorators:
def now(self, datas):
print("now()传入参数……{}".format(datas))
if __name__ == '__main__':
dd = decorators()
dd.now(("ss", "ssdf", "sdf")) # 调用并传入参数
print(dd.now.__name__) # 打印__name_属性
控制台输出,
- 写打印日志的装饰器方法,直接复制能用就行
import functools
def log(text):
def decorator(func):
@functools.wraps(func)
def wrapper(*args, **kw):
print('%s%s' % (text, func.__name__))
print("*args是……{}".format(str(args)))
print("**kw是……{}".format(str(kw)))
return func(*args, **kw)
return wrapper
return decorator
- 直接装饰在方法上,传入参数
class decorators:
@log("现在执行方法……")
def now(self, datas):
print("now()传入参数……{}".format(datas))
if __name__ == '__main__':
dd = decorators()
dd.now(("ss", "ssdf", "sdf")) # 调用并传入参数
print(dd.now.__name__) # 打印__name_属性
- 进行调试,断点在调用now()方法上,可以看到直接进入
print('%s%s' % (text, func.__name__))
。 - 看下图,log()和now()方法都正确传入参数,因为调用now()方法,先执行上面的@log装饰器,log()方法连续两个return调用decorator、wrapper方法,最终就开始执行wrapper方法行
print('%s%s' % (text, func.__name__))
。
- 等调试走完wrapper方法,才回到now()方法执行,所以控制台输出
- 插入日志时只要修改以下两个地方,第一个固定,第二个就需要根据方法更改描述