4.1 装饰器详解
一、装饰器介绍:
定义:本质是函数,作用是为其他函数添加附加功能
原则:【1】不能修改被装饰函数的源代码 【2】不能修改被装饰函数的调用方式
二、装饰器实现:
原理:【1】先通过高阶函数实现函数的包装修饰 【2】再通过内嵌函数+被装饰函数的定义变更,实现调用方式的保留
操作:
【第一层函数】通过高阶函数装饰
例:
现有函数
def test():
print(“test”)
通过高阶函数方式执行test并额外打印“a":
def deco(func):
func()
print("a")
这样,执行deco(test)时,就会既执行test又打印了“a“
【第二层函数】通过内嵌函数+定义变更,实现调用方式的保留
如上述操作,若加多一条
test=deco(test)
那么只要执行
test
亦可达到同样的效果,但是test与test()还是有区别的,那么如何用test()来表达test呢?
只要再加一层函数即可:
def more(func):
def deco():
func()
print("a")
return deco
这时,若加test=more(test),则执行test(),即可达到想要的效果了
且python已经将底部代码包装,在被装饰函数上面写上:@more,即可起到执行前执行test=more(test)命令的效果
【第三层函数】第二层函数其实已经达到了想要的效果,这第三层函数是拓展型函数,可为装饰器本身传递函数,用来增加装饰器的可变性
如上面,在more()函数外再加一层函数more2:
def more2(a):
def more(func):
def deco():
func()
print("a")
return deco
return more
即可在装饰时传递函数,使用方式为:
@more2(a=3)