介绍一下Python的装饰器?
简单来说:为已存在的对象添加额外功能。
在不改变源代码和调用方法的基础上,添加额外功能。
优点:提高了程序的可重复利用性,增加了程序的可读性
详细来说:
装饰器有函数装饰器和类装饰器
函数装饰器有带参和不带参(最简单,2层)
介绍:
python的函数装饰器是一个嵌套函数,外部函数的参数是被装饰函数名,
返回的是内部函数的引用,内部函数的参数是被装饰函数的参数,返回的
是被装饰函数的返回值。
python提供@语法糖,来调用装饰器,在原函数上加上@装饰器名
一个函数可被多个装饰器装饰,这时候的执行过程是从下自上的
def deco(func):
def wrap(*args, **kwargs):
return func(*args, **kwargs)
return wrap
@deco
def foo(a, b):
return a ** b
------------------------------------------------------------------
装饰器的调用,在原函数上加上@装饰器名
实际过程是:
foo = deco(foo)
foo()
将原函数名引用传递给装饰器函数,装饰器返回一个内置函数引用,最后在调用原函数的时候
实际上是调用了装饰器的内置函数
当多个装饰器装饰一个函数,其执行顺序是从下往上,检验过程是先检验上面的,再检验下面的
@deco1
@deco2
@deco3
def foo(x, y):
return x ** y
# 过程拆解 1
fn3 = deco3(foo)
fn2 = deco2(fn3)
fn1 = deco1(fn2)
foo = fn1
foo(3, 4)
# 过程拆解 2
# 单行: deco1( deco2( deco3(foo) ) )(3, 2)
deco1(
deco2(
deco3(foo)
)
)(3, 4)