生活随笔
收集整理的這篇文章主要介紹了
python标准库--functools.partial
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
?
官方相關地址:https://docs.python.org/3.6/library/functools.html
一.簡單介紹:
? ? ? ? functools模塊用于高階函數:作用于或返回其他函數的函數。一般而言,任何可調用對象都可以作為本模塊用途的函數來處理。
? ? ? ? functools.partial返回的是一個可調用的partial對象,使用方法是partial(func,*args,**kw),func是必須要傳入的,而且至少需要一個args或是kw參數。
創建一個功能函數,實現三個數的相加,如果其中的一個或是多個參數不變,那么可以使用partial,實例化一個傳入了add和12參數的對象,如上圖所示,傳入兩個參數后,得到三個數的和。
二.partial源碼分析:
? ??1.__new__方法部分
class partial: """New function with partial application of the given arguments and keywords. """ __slots__ = "func", "args", "keywords", "__dict__", "__weakref__" def __new__(*args, **keywords): if not args: raise TypeError("descriptor '__new__' of partial needs an argument") if len(args) < 2: raise TypeError("type 'partial' takes at least one argument") cls, func, *args = args if not callable(func): raise TypeError("the first argument must be callable") args = tuple(args) if hasattr(func, "func"): args = func.args + args tmpkw = func.keywords.copy() tmpkw.update(keywords) keywords = tmpkw del tmpkw func = func.func self = super(partial, cls).__new__(cls) self.func = func self.args = args self.keywords = keywords return self 上面的代碼創建了一個實例對象(p=partial(func,*args,**kw)),并給對象本身添加了屬性。
????2. __call__方法部分
再看可調用的部分,partial實例化的對象是一個可調用的,是因為在partial中寫了__call__方法,看源碼:
def __call__(*args, **keywords): if not args: raise TypeError("descriptor '__call__' of partial needs an argument") self, *args = args newkeywords = self.keywords.copy() newkeywords.update(keywords) return self.func(*self.args, *args, **newkeywords) 在使用p(*args,**keywords)的時候,就會自動的調用__call__方法,這就是生成的對象可調用的原因,self是實例化對象本身,*args、**kw是我們傳入函數func的參數,但是只是傳入了部分參數,這也是partial的作用所在,所以還要將partial(func,*args,**kw)中的位置參數和關鍵字參數與p(*args,**keywords)一并傳入到函數func中來實現函數的功能。官網中解釋partial的功能實現相當于:
def partial(func, *args, **keywords): def newfunc(*fargs, **fkeywords): newkeywords = keywords.copy() newkeywords.update(fkeywords) return func(*args, *fargs, **newkeywords) newfunc.func = func newfunc.args = args newfunc.keywords = keywords return newfunc 當調用partial函數的時候,返回的是newfunc函數對象,讓f=partial(add,12),相當了f=newfunc,所以f是一個可調用的對象,因此f(1,2)-->等價于newfunc(1,2)-->將參數整合傳入到func中,并返回func實現其功能。
?
轉載于:https://www.cnblogs.com/qunxiadexiaoxiangjiao/p/9577734.html
總結
以上是生活随笔為你收集整理的python标准库--functools.partial的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。