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 "<stdin>", line 1, in <module> TypeError: an integer is required >>> int2 = partial(int, base=2) # 把base參數綁定在int2這個函數里 >>> int2('10') # 現在缺省參數base被設為2了 2 >>> int2('10', 3) # 沒加base,結果又出錯了 Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: keyword parameter 'base' was given by position and by name >>> int2('10', base=3) 3 >>> type(int2) <type 'functools.partial'> 從中可以看出,唯一要注意的是可選參數必須寫出參數名。
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>]
新聞熱點
疑難解答
圖片精選