Python基础(8)-装饰器和偏函数

函数对象有一个__name__属性,可以拿到函数的名字

装饰器Decorator

定义:在代码运行期间动态增加功能的方法
比如若要在执行now() 函数时,自动打印一个日志,但不希望改变函数的定义。
本质上,Decorator就是一个返回函数的高阶函数。所以,定义一个能打印日志的Decortor,如下:

def log(func):
    def warpper(*args,**kw):
        print('call:%s()'% func.__name__)
        print(args)
        print(kw)
        return func(*args,**kw)
    return warpper

然后将decortor函数置于函数的定义处:

@log
def now(n,**kw):
    print('now run%s'%n)
    return 0

这样,当调用函数now([1,2,3],**{'char':'a'})时,执行如下:

now([1,2,3],**{'char':'a'})
call:now()
([1, 2, 3],)
{'char': 'a'}
now run[1, 2, 3]
0
>>> 

所以,当调用now函数时,会调用log()函数。但是此时,函数的__name__属性已经变为warpper()了,在某些需要判断函数名的程序中会出现错误,所以,需要使用functools模块。
如下:

import functools
def log(func):
    @functools.wraps(func)#多了这行
    def warpper(*args,**kw):
        print('call:%s()'% func.__name__)
        print(args)
        print(kw)
        return func(*args,**kw)
    return warpper

可以执行now.__name__,得到的是now()

偏函数

Python的functions模块提供了偏函数(Partial function)。
其实就是通过设定函数参数的默认值,降低函数调用的难度。
比如:int() 函数将字符串转为数字,默认参数为base=10 若我们要转为2进制,则int('123',base=16)

int('123',16)
291
>>> 

当我们使用偏函数时,可以这样定义:

import functools
int16=functools.partial(int,base=16)

则执行如下:

int16('123')
291
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值