函数对象有一个__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