python函数-装饰器
1.装饰器的原则--开放封闭原则
开放:对于添加新功能是开放的
封闭:对于修改原功能是封闭的
2.装饰器的作用
在不更改原函数调用方式的前提下对原函数添加新功能
3.装饰器的本质--闭包
4.装饰器
(1)简单的装饰器
def deco(f):def wrapper():"""原函数前添加的功能"""f()"""原函数后添加的功能"""return wrapperdef 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 resreturn wrapper@deco
def func():print('这是原函数')
func()
(4)装饰器加参数的固定格式
def deco(f):def wrapper(*args,**kwargs):"""原函数前添加的功能"""res = f(*args,**kwargs)"""原函数后添加的功能"""return resreturn wrapper@deco
def func(*args,**kwargs):print('这是原函数')
func()
(5)装饰器的固定格式--wraps版
from functools import wrapsdef wrapper(func):@wraps(func)def inner(*args,**kwargs):print('在被装饰的函数执行之前做的事')ret = func(*args,**kwargs)print('在被装饰的函数执行之后做的事')return retreturn 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 inner1def 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