python学习笔记day12 装饰器进阶(二)

wraps

其实之前我们看到过,打印被修饰的函数名的时候发现已经不是自己了就是因为,@wrapper 其实就相当于func=wrapper(func) 在全局命名空间中,func已经不是原来定义的func函数了,而是装饰器函数内部的一个闭包函数inner 因为func是wrapper函数的返回值了,原来的func函数已经作为参数传递给wrapper函数的f参数了!

def wrapper(f):
    def inner(*args,**kwargs):
        ret=f(*args,**kwargs)
        return ret
    return inner
@wrapper
def func(a,b):
    print(a,b)
    return "哈哈哈"
print(func(1,2))
print(func.__name__)

运行结果:

其实我们可以借助functools中的wraps 是别人写好的装饰器函数,我们直接拿来用,效果就是可以使得加上装饰器扩充了功能的func函数变得看起来跟之前的调用一样啦:

from functools import wraps
def wrapper(f):
    @wraps(f)  #在装饰器函数内部的闭包函数上方加上@wraps(被装饰的函数名)
    def inner(*args,**kwargs):
        ret=f(*args,**kwargs)
        return ret
    return inner
@wrapper
def func(a,b):
    print(a,b)
    return "哈哈哈"

print(func(1,2))
print(func.__name__)

运行结果:

带有参数的装饰器

多个装饰器函数装饰同一个函数

猜你喜欢

转载自www.cnblogs.com/xuanxuanlove/p/9571866.html