Python装饰器
简单装饰器
1.装饰器的本质就是一个函数,在不改变原函数功能的情况下,动态为函数增加功能
def info(func): --本质就是一个函数
print(f'调用函数 -> {func.__name__}')
return func --为函数增加一个打印日志的功能:显示调用的函数名称
----原函数--------
@info -------------加上装饰器
def add(a,b):
print(a+b)
return a+b
@info -------------加上装饰器
def sub(a,b):
print(a-b)
return a-b
if __name__=='__main__':
add(4,6)
sub(5,2)
--------结果---------
调用函数 -> add -----调用加法函数的时候打印了一个日志:调用了add函数
调用函数 -> sub -----调用减法法函数的时候打印了一个日志:调用了sub函数
10 -----同时没有改变原函数的功能,实现了加法运算
3 -----同时没有改变原函数的功能,实现了减法运算
---------------------------------------------------------------------------------------------------------------------------------------------
普通装饰器
在装饰器里使用一个和原函数有相同功能的新函数替换原函数,目的是拿到原函数的参数,对参数进行处理
新函数不要写死,否则无法动态增加功能,比如下边的例子
新函数my_add新函数功能写死了,只能做加法,如果是减法调用了,本来是要做减法的,结果却是做出来了加法,这就出bug了
调用了add的参数,然后参数在my_add里运行了,返回了my_add的运行结果
def my_add(a,b):
print(f'调用my_add参数为 {a},{b}')
return a+b
def deco(func):
return my_add
@deco
def add(a,b):
return a+b
@deco
def sub(a,b):
return a-b
if __name__=='__main__':
add=sub(11,2)
print(add)
------------------------------------------------------------------------------
调用my_add参数为 11,2
13
普通装饰器需求:拿到原函数的参数,返回值 进行一些处理
例如 打印调用函数时的实际参数,参数检查,返回值格式化等
实现方法 新建一个相同功能的函数替换原函数
怎样快速创建一个和原函数功能相同的新函数呢,就是给原函数套壳
def deco(func):
def new_func(a,b): ---------在装饰器里新建新函数
print(f'调用 {func.__name__} 参数为 {a},{b}')
return func(a,b) ---------新函数直接调用原函数就行
return new_func ------对原函数进行套壳快速构建一个具有相同功能的新函数
@deco
def add(a,b):
return a+b
@deco
def sub(a,b):
return a-b
# if __name__=='__main__':
# add=sub(11,2)
print(add(11,100))
-------------------------------------------------------------------------
调用 add 参数为 11,100
111
-------------------------------------------------------------------------------------
上边的只能传两个参数,参数超过两个了就不行了
任意参数的新函数,加上*args,**kwargs可以传任意个数参数,
def decorator(func): ----------------装饰器:输入一个函数 返回一个(同功能)函数 装饰器的名称可以随意起
def new_func(*args,**kwargs): --------套壳函数,原函数同功能的函数 新函数的名称可以随意起
print(f'调用 {func.__name__} 参数为 {args},{kwargs}')
return func(*args,**kwargs)
return new_func
@decorator
def add(a,b):
return a+b
@decorator
def sub(a,b):
return a-b
@decorator
def sys(a,b,c):
return a*b*c
# if __name__=='__main__':
# add=sub(11,2)
print(sys(11,100,12))
-----------------------------------------------------------------------------------------------
调用 sys 参数为 (11, 100, 12),{}
13200