1.partial
Die erste ist die Teilfunktion, die die optionalen Parameter der Funktion neu binden und ein aufrufbares Teilobjekt generieren kann:
>>> 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'>
Wie daraus ersichtlich ist, ist lediglich zu beachten, dass der optionale Parameter den Parameternamen schreiben muss.
2.update_wrapper
Dann gibt es die Funktion update_wrapper, die __name__, __module__, __doc__ und __dict__ der gekapselten Funktion in die Kapselungsfunktion kopieren kann:
#-*- 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__
Ergebnis:
对啊,怎样才算活着呢?活着就是吃嘛。 None 对啊,怎样才算活着呢?活着就是吃嘛。 什么是活着
Aber es nützt schließlich nicht viel , es werden nur 4 Zeilen weniger Zuweisungsanweisungen geschrieben.
3.wraps
Dann gibt es noch die Wraps-Funktion, die auch update_wrapper kapselt:
#-*- 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__
Das Ergebnis ist immer noch das gleiche:
对啊,怎样才算活着呢?活着就是吃嘛。 什么是活着
4.total_ordering
Schließlich ist die total_ordering-Funktion Geben Sie klassenreiche Sortiermethoden an und verwenden Sie Dekoratoren, um den Betrieb zu vereinfachen. Bei Verwendung muss in der Klasse ein __lt__(), __le__(), __gt__() oder __ge__() definiert werden. Der Klasse sollte eine __eq__()-Methode hinzugefügt werden.
from functools import total_ordering @total_ordering class 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 > b print a print sorted([b, a])
Ergebnisse drucken
False <__main__.Student object at 0x7f16ecb194d0> [<__main__.Student object at 0x7f16ecb194d0>, <__main__.Student object at 0x7f16ecb195d0>]
Weitere Artikel zur allgemeinen Funktionsanalyse des Functools-Moduls in Python finden Sie auf der chinesischen PHP-Website!