1.partial
首先是partial
函数,它可以重新绑定函数的可选参数,生成一个
callable
的
partial
对象:
>>> int('10') #
实际上等同于
int('10', base=10)
和
int('10', 10) 10 >>> int('10', 2) #
实际上是
int('10', base=2)
的缩写
2 >>> from functools import partial >>> int2 = partial(int, 2) #
这里我没写
base
,结果就出错了
>>> int2('10')
Traceback (most recent call last):
File "", line 1, in
Traceback (most recent call last):
File "", line 1, in
从中可以看出,唯一要注意的是可选参数必须写出参数名。
2.update_wrapper
接着是update_wrapper
函数,它可以把被封装函数的
__name__
、
__module__
、
__doc__
和
__dict__
都复制到封装函数去:
#-*- coding: gbk -*-
def thisIsliving(fun):
def living(*args, **kw):
return fun(*args, **kw) + '
活着就是吃嘛。
'
return living
@thisIsliving def whatIsLiving():
"
什么是活着
"
return '
对啊,怎样才算活着呢?
'
print whatIsLiving() print whatIsLiving.__doc__
print
from functools import update_wrapper def thisIsliving(fun):
def living(*args, **kw):
return fun(*args, **kw) + '
活着就是吃嘛。
'
return update_wrapper(living, fun)
@thisIsliving def whatIsLiving():
"
什么是活着
"
return '
对啊,怎样才算活着呢?
'
print whatIsLiving() print whatIsLiving.__doc__
结果:
对啊,怎样才算活着呢?活着就是吃嘛。None
对啊,怎样才算活着呢?活着就是吃嘛。
什么是活着
不过也没多大用处,毕竟只是少写了4
行赋值语句而已。
3.wraps
再有是wraps
函数,它将
update_wrapper
也封装了进来:
#-*- coding: gbk -*-
from functools import wraps
def thisIsliving(fun): @wraps(fun)
def living(*args, **kw):
return fun(*args, **kw) + '
活着就是吃嘛。
'
return living
@thisIsliving def whatIsLiving():
"
什么是活着
"
return '
对啊,怎样才算活着呢?
'
print whatIsLiving() print whatIsLiving.__doc__
结果还是一样的:
对啊,怎样才算活着呢?活着就是吃嘛。
什么是活着
4.total_ordering
最后至于total_ordering
函数则给予类丰富的排序方法,使用装饰器简化了操作。如果使用必须在类里面定义一个
__lt__(),__le__(), __gt__(),
或
__ge__()
。应该给类添加一个
__eq__()
方法。
from functools import total_ordering
@total_orderingclass Student(object):
def __init__(self, name):
self.name = name
def __eq__(self, other):
return self.name.lower() == other.name.lower()
def __lt__(self, other):
return self.name.lower() < other.name.lower()
a = Student('dan')
b = Student('mink')
print a > bprint aprint sorted([b, a])
打印结果
False
<__main__.student object="" at="" 0x7f16ecb194d0="">[<__main__.student object="" at="" 0x7f16ecb194d0="">,<__main__.student object="" at="" 0x7f16ecb195d0="">]
来源: Linux
视野
|