https://docs.python.org/zh-cn/3.7/library/functions.html
1.闭包回顾
在学习装饰器之前,可以先复习一下什么是闭包?
在嵌套函数内部的函数可以使用外部变量(非全局变量)叫做闭包!
def wrapper(): money =10 def inner(num): nonlocal money money +=num print(money) print(inner.__closure__) #不返回none的话就是闭包 return inner wrapper()(100) 复制代码
#不返回none的话就是闭包
2.装饰器


装饰器本质上就是一个python函数,他可以让其他函数在不需要做任何代码变动的前提下,增加额外的功能,装饰器的返回值也是一个函数对象。 装饰器的应用场景:比如插入日志,性能测试,事务处理,缓存等等场景。 #简单的装饰器 def func(): print('嘻嘻更健康') def timmer(f): def inner(): start_time = time.time() time.sleep(0.1) f() end_time = time.time() print('----> 执行效率%s' % (end_time - start_time)) return inner func = timmer(func) # inner func() # inner() 这是最简单的装饰器,装饰任何函数,只需要加一句func = timmer(func)
3.装饰器语法糖


import time def timer(func): def inner(): start = time.time() func() print(time.time() - start) return inner @timer 等价于func1 = timer(func1),@timer会先拿到下面函数的名字,然后把拿到名字的函数传给timer装饰器函数 def func1(): print('in func1') func1()
def timer(func): def inner(a): start = time.time() func(a) print(time.time() - start) return inner @timer def func1(a): print(a) func1(1)
装饰器hold带参数


import time def timer(func): def inner(*args,**kwargs): start = time.time() re = func(*args,**kwargs) print(time.time() - start) return re return inner @timer #==> func1 = timer(func1) def func1(a,b): print('in func1') @timer #==> func2 = timer(func2) def func2(a): print('in func2 and get a:%s'%(a)) return 'fun2 over' func1('aaaaaa','bbbbbb') print(func2('aaaaaa'))
上面的装饰器已经非常完美了,但是有我们正常情况下查看函数信息的方法在此处都会失效:


from functools import wraps def deco(func): @wraps(func) #加在最内层函数正上方,显示被装饰的函数 def wrapper(*args,**kwargs): return func(*args,**kwargs) return wrapper @deco def index(): '''哈哈哈哈''' print('from index') print(index.__doc__) #显示被装饰函数的注释 print(index.__name__) #显示被装饰的函数名
4.开放封闭原则
开放对扩展代码--->新添加的功能 封闭修改源代码--->不要修改源代码 改变了人家调用方式---->不能改变其原有的调用方式
5带参数的装饰器


假如你有成千上万个函数使用了一个装饰器,现在你想把这些装饰器都取消掉,你要怎么做? 一个一个的取消掉? 没日没夜忙活3天。。。 过两天你领导想通了,再让你加上。。。 def outer(flag): def timer(func): def inner(*args,**kwargs): if flag: print('''执行函数之前要做的''') re = func(*args,**kwargs) if flag: print('''执行函数之后要做的''') return re return inner return timer @outer(False) def func(): print(111) func()
6.多个装饰器装饰一个函数


def wrapper1(func): def inner(): print('wrapper1 ,before func') func() print('wrapper1 ,after func') return inner def wrapper2(func): def inner(): print('wrapper2 ,before func') func() print('wrapper2 ,after func') return inner @wrapper2 @wrapper1 def f(): print('in f') f() 执行顺序 wrapper2 ,before func wrapper1 ,before func in f wrapper1 ,after func wrapper2 ,after func
7.内置函数
*****思维导图*****
https://docs.python.org/zh-cn/3.7/library/functions.html
文章:https://www.cnblogs.com/eric_yi/p/7255455.html
文章:https://www.cnblogs.com/cicaday/p/python-decorator.html