您的位置:首页 > 编程语言 > Python开发

16.python函数式编程(三)—装饰器,偏函数

2018-03-18 17:44 127 查看
3)装饰器有点懵,说实话,没怎么看懂。先说一下,什么事装饰器。装饰器是我们想要加强一个函数的功能,但是又不想改变他之前的函数定义。我理解的大致原理大概是,先改名字,再改名字,再取名字。实际上,装饰器是一个高阶函数。示例代码如下:def log(func):
def wrapper(*args, **kw):
print 'call %s():' % func.__name__
return func(*args, **kw)
return wrapper
@log
def now():
print '2018-3-18'
now()这里的@log相当于now=log(now)。我们先把原作者的解释贴下来:



有点懵是吧,我们从头开始。现在调用now()函数,now函数是存在的。但是now()的函数名,指向了一个新的函数。也就是说,现在两个函数叫一个名字。调用now(),将执行另一个加强版的now(也就是wrapper),因为wrapper是接收两个参数,一个是可变参数,一个是关键字参数。所以可以接受任意参数。接下来,打印日志,我们注意到这里,return func,即返回原始函数now()。这样now函数便保留下来了。而外面的return wrapper,返回了加强版的now(也就是wrapper)。
通俗点讲的话,先把now函数的名字给别人,然后别人用完了再还给now函数。这个人谁呢?就是wrapper。
上面讲的是两层嵌套。下面还有三层嵌套,示例代码如下:def log(text):
def decorator(func):
def wrapper(*args, **kw):
print '%s %s():' % (text, func.__name__)
return func(*args, **kw)
return wrapper
return decorator
@log('execute')
def now():
print '2018-3-18这里:now = log('execute')(now)。
我们继续分析:
首先执行log('execute'),返回decorator函数。然后调用参数,参数是now()。打印,再保留now函数。再返回wrapper。
我们这里要注意:函数也是对象。他有属性,但是经过装饰的函数,属性已经变了,比如now.__name__
'wrapper'这里需要把原始函数的属性,复制到wrapper中。
[b]4)偏函数[/b]这里的偏函数就是把一个函数的某个参数固定住,然后再定义一个函数,方便使用。示例代码如下:import functools
int2 = functools.partial(int, base=2)
int2('1000000')
64
int2('1010101')
85这里偏函数的功能字是:functool.partial。
希望有志同道合的小伙伴关注我的公众平台,欢迎您的批评指正。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: