Python 装饰器常见方法 functools.wraps 详解

我们知道函数被装饰器,装饰后,所有的属性,以及内置函数就失效了,原因是函数类型变成了装饰器返回的函数的类型。

def warfunc(func):
    def xy_ret(*args,**kwargs):
        print('warpper demo')
        ret = func(*args,**kwargs)
        return ret
    return xy_ret

@warfunc
def demofunc():
    print('func demo')

demofunc()
print(demofunc)
"""
warpper demo
func demo
<function warfunc.<locals>.xy_ret at 0x000001FFB0B29318>
"""

从输出结果可以看出,这个函数类型是一个warfunc装饰器返回的xy_ret函数。那么内置函数也失效了。如help(demofunc())。

如果带 wraps 装饰器,可以将被包装的函数对象的属性传递给后装后的函数。

from functools import wraps

def warfunc(func):
    @wraps(func)
    def warpper(*args,**kwargs):
        print('warpper demo')
        ret = func(*args,**kwargs)
        return ret
    return warpper


@warfunc
def demofunc():
    print('func demo')

demofunc()
print(demofunc)
"""
D:\python36\python3.exe D:/untitled4/temp7.py
warpper demo
func demo
<function demofunc at 0x038632B8>
"""

 

 

本文参考 

python装饰器扩展之functools.wraps

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值