python函数-装饰器
1.装饰器的原则--开放封闭原则
开放:对于添加新功能是开放的
封闭:对于修改原功能是封闭的
2.装饰器的作用
在不更改原函数调用方式的前提下对原函数添加新功能
3.装饰器的本质--闭包
4.装饰器
(1)简单的装饰器
def deco(f): def wrapper(): """原函数前添加的功能""" f() """原函数后添加的功能""" return wrapper def func(): print('这是原函数!') func = deco(func) func()
(2)装饰器的语法糖-----@deco
def deco(f): def wrapper(): """原函数前添加的功能""" f() """原函数后添加的功能""" return wrapper @deco # ——>此处效果等同于 func = deco(func) def func(): print('这是原函数') func()
(3)带返回值的装饰器
def deco(f): def wrapper(): """原函数前添加的功能""" res = f() """原函数后添加的功能""" return res return wrapper @deco def func(): print('这是原函数') func()
(4)装饰器加参数的固定格式
def deco(f): def wrapper(*args,**kwargs): """原函数前添加的功能""" res = f(*args,**kwargs) """原函数后添加的功能""" return res return wrapper @deco def func(*args,**kwargs): print('这是原函数') func()
(5)装饰器的固定格式--wraps版
from functools import wraps def wrapper(func): @wraps(func) def inner(*args,**kwargs): print('在被装饰的函数执行之前做的事') ret = func(*args,**kwargs) print('在被装饰的函数执行之后做的事') return ret return inner @wrapper def holiday(day): print("新年快乐") return '好开心' print(holiday.__name__) print(holiday.__doc__) ret = holiday(3) print(ret) >>>> holiday None 在被装饰的函数执行之前做的事 新年快乐 在被装饰的函数执行之后做的事 好开心
(6) 多个装饰器装饰一个函数
def wrapper1(func): def inner1(): print('wrapper1 ,before func') func() print('wrapper1 ,after func') return inner1 def wrapper2(func): def inner2(): print('wrapper2 ,before func') func() print('wrapper2 ,after func') return inner2 @wrapper2 # 将inner1进行装饰,即inner1 = wrapper2(inner1) = inner2 @wrapper1 # 先执行这个装饰器,即f = wrapper1(f) = inner1 def f(): print('in f') f() >>>> wrapper2 ,before func wrapper1 ,before func in f wrapper1 ,after func wrapper2 ,after func