装饰器:装饰器本质上是一个函数,该函数用来处理其他函数,它可以让其他函数在不需要修改代码的前提下增加额外的功能,装饰器的返回值也是一个函数对象
python函数(python3.7)
1.函数作用域LEGB
L > E > G > B
L:local -函数内部作用域
E:enclosing -函数内部与内嵌函数之间
G:global -全局变量
B:build-in -内置作用域
1 passline = 60 # 全局变量2 3 def func(val):4 if val >= passline:5 print('pass')6 else:7 print('failed')8 func(86)
2.闭包理解与使用
函数实质与属性
1.函数是一个对象
2.函数执行完成之后内部变量回收
3.函数属性
4.函数返回值
passline = 60def func(val): if val >= passline: print('pass') else: print('failed') def in_func(): print(val) return in_funcf = func(68)f()
def set_passline(passline): def cmpp(val): if val>=passline:; print('pass') else: print('failed') return cmpp
3.装饰器(本质是一个闭包)
装饰器形成的过程
装饰器的作用
不想修改函数的调用方式,但是还想在原来的函数前后添加功能
timer就是一个装饰器函数,只有对一个函数有一些装饰作用
@timer 魔法糖(调用装饰器的方式)
原则:开放封闭原则
开放:对扩展时开放的
封闭:对修改是封闭的
装饰器的固定模式
def wrapper(f): #装饰器函数,f是被装饰的函数 def inner(*args,**kwargs): “”“在被装饰函数之前要做的事”“” ret = f(*args,**kwargs) #被装饰的函数 “”“在被装饰函数之后要做的事”“” return ret return inner@wrapper # @装饰器函数 func = wrapper(func)
def func(*args,**kwargs): #被装饰函数 time.sleep(0.01) print("hello world") return "新年好" func() #实际上执行的inner()
装饰器进阶
functools.wraps
构造完美装饰器
# 当要获取func.__name__,这样没有改变原函数的__name__def wrapper(func): @wraps(func) def inner(*args,**kwargs): ret = func(*args,**kwargs) return ret return inner@wrapperdef func(): pass func.__name__
带参数的装饰器
# @warpper --> @warpper(argument)
# 三层嵌套
# 带参数的装饰器def outer(flag): def timer(func): def inner(*args,**kwargs): if flag: print("执行函数之前要做的") ret = func(*args,**kwargs) if flag: print("执行函数之后要做的") return retreturn inner return timer@outer(False)def func(): passfunc()
多个装饰器装饰同一个函数
def warpper1(func): def inner(*args,**kwargs): print("wrapper1 , before func!") re = func(*args,**kwargs) print("warpper1 , after func!") return re return innerdef warpper2(func): def inner(*args,**kwargs): print("wrapper2 , before func!") re = func(*args,**kwargs) print("warpper2 , after func!") return re return inner@warpper1@warpper2def func(): passfunc()
1.执行warpper1中func之前的内容
2.执行warpper2中func之前的内容
3.执行warpper2中func之后的内容
4.执行warpper1中func之后的内容