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中。
4)偏函数
这里的偏函数就是把一个函数的某个参数固定住,然后再定义一个函数,方便使用。示例代码如下:
import functools
int2 = functools.partial(int, base=2)
int2('1000000')
64
int2('1010101')
85
这里偏函数的功能字是:functool.partial。
希望有志同道合的小伙伴关注我的公众平台,欢迎您的批评指正。