python装饰器讲解

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/weixin_41656968/article/details/80232507

python装饰器用来扩展原来函数功能,能让函数在不做任何变动的情况下增加某些额外的功能

比如插入日志、性能测试、时间测试等等

装饰器的返回值也是一个函数对象


在了解装饰器之前我们先来了解一下python中的*和**

下面请看代码:

def mul(*args):
    for value in args:
        print("args:", value)
    print(args)
    print(*args)

def mul2(**kw):
    for key, value in kw.items():
        print(key + ":" + value)
    print(kw)
    print(*kw)   
    
if __name__ == '__main__':
    mul(1,'a',True)
    print('\n')
    mul2(name='Tony', age='20', single='True')


程序截图:


看见程序后应该有点意思了吧,*号就像一只手一样,把你要用到的数据抓出来

其实概括性的就两句话:

一个星(*):表示接收的参数作为tuple来处理

两个星(**):表示接收的参数作为dict来处理


接下来看一个没有参数的简易装饰器,让大家了解一下装饰器的功能:

def decorator(func):
    def wrapper():
        print('start {}'.format(func.__name__))
    return wrapper
    
@decorator
def func_a():
    pass

@decorator
def func_b():
    pass

def func_c():
    pass
func_c = decorator(func_c)        # decorator装饰器和这句功能一样

这个装饰器很简单,就是在每个函数运行时都打印start+函数名


再来看每个函数运行截图:


看到func_c函数运行起来和a、b没什么区别



一般的装饰器都得携带或多或少的几个参数,同时加上*args和**kw的话我们就不用担心收到的是个tuple还是dict了

也不管收到的有几个参数,如果tuple和dict混杂起来,得保证tuple的参数在前面

程序如下:

def decorator(func):
    def wrapper(*args, **kw):
        print('start {}'.format(func.__name__))
        return func(*args, **kw)
    return wrapper
    
@decorator
def func_a(a, b):
    return a + b

@decorator
def func_b(a, b, c):
    return a + b + c

@decorator
def func_c(a=5, b=3):
    return a - b

@decorator
def func_d(a, b=3, c=5):
    return a - b + c

我给的例子还是比较典型的,一个tuple,一个三个参数的tuple,一个dict,还有一个tuple混dict



程序运行截图:



展开阅读全文

没有更多推荐了,返回首页