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

 

posted @ 2023-06-24 22:31  zongsuan  阅读(23)  评论(0编辑  收藏  举报