国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 編程 > Python > 正文

淺談python裝飾器探究與參數(shù)的領(lǐng)取

2020-01-04 16:13:13
字體:
供稿:網(wǎng)友

首先上原文:

現(xiàn)在,假設(shè)我們要增強(qiáng)now()函數(shù)的功能,比如,在函數(shù)調(diào)用前后自動(dòng)打印日志,但又不希望修改now()函數(shù)的定義,這種在代碼運(yùn)行期間動(dòng)態(tài)增加功能的方式,稱之為“裝飾器”(Decorator)。

本質(zhì)上,decorator就是一個(gè)返回函數(shù)的高階函數(shù)。

Decorator本質(zhì)是高階函數(shù)?

不信邪的我試了下..

def g(): print("這里是G") return "G"@gdef f(): print("這里是F") return 1'''--------------------------------------------line 5, in <module> @gTypeError: g() takes 0 positional arguments but 1 was given>>>'''

運(yùn)行結(jié)果在注釋里

尷尬了...g被強(qiáng)制塞了個(gè)參數(shù),那個(gè)參數(shù)應(yīng)該是g"修飾的對(duì)象"

修改下繼續(xù).....

def g(f): print("這里是G") return "G"@gdef f(): print("這里是F") return 1'''--------------------------------------------這里是G>>> f()Traceback (most recent call last): File "<pyshell#0>", line 1, in <module> f()TypeError: 'str' object is not callable'''

str對(duì)象不能被調(diào)用,,,這里的str只有一個(gè),就是g的返回值

為了驗(yàn)證下,我把"G"改成了2

結(jié)果是

TypeError: 'int' object is not callable

OK了,大概意思就是,裝飾器首先被"塞"一個(gè)參數(shù),然后,返回值還要被調(diào)用一次,然而好像只有函數(shù)才能被調(diào)用,,所以,為了不報(bào)錯(cuò),裝飾器必須返回一個(gè)函數(shù),裝飾器必須是高階函數(shù)......

我表示不服( ̄へ ̄),不就是函數(shù)嗎,g的參數(shù)就是函數(shù),,,騷操作上腦ing

def g(f): print("這里是G") return f@gdef f(): print("這里是F") return 1'''--------------------------------------------這里是G>>> f()這里是F'1''''

運(yùn)行成功.但是....說好的"打印日志功能"呢,#沒錯(cuò)"這里是G"就是我想要的日志

疑點(diǎn)一: 打印的"這里是G"是第一行,是在輸入"f()"之前發(fā)生的....

疑點(diǎn)二: 輸入"f()"后,"這里是G"沒打出來.....

#單看g函數(shù),它不算是"高階函數(shù)"

作為成功的例子,它太失敗了┐( ̄ヘ ̄)┌

##好吧,我投降了,負(fù)隅頑抗也不怎么有意思.....

閉包告訴我們一個(gè)道理,,,為了保證返回值一定是函數(shù),最好的措施就是"在函數(shù)內(nèi)部,現(xiàn)場(chǎng)造一個(gè)函數(shù)然后扔出去"

def g(f): print("這里是G") def h():  print('這里是H')  return "H" return h@gdef f(): print("這里是F") return 1'''--------------------------------------------這里是G>>> f()這里是H'H'>>> f()這里是H'H'>>> '''

f函數(shù)不執(zhí)行了,,是的沒錯(cuò),我還多試了一次的

另外,兩條日志只有里面的能用......(下文會(huì)解釋的)

看了一下書,h函數(shù)返回f()的話,f函數(shù)就能被執(zhí)行了,,,,,個(gè)人感覺裝飾器應(yīng)該叫"劫持器"

def g(f): print("這里是G") def h():  print('這里是H')  return f() return h@gdef f(): print("這里是F") return 1'''--------------------------------------------這里是G>>> f()這里是H這里是F'1'>>> f<function g.<locals>.h at 0x0000020CBDBB6C80>'''

按書上的思路解釋下

'''@gdef f(): pass>>>f()等價(jià)于>>>g(f) ()g函數(shù)執(zhí)行,返回>>>h ()h函數(shù)執(zhí)行(打印日志)>>>f()f執(zhí)行,返回1>>>1'''

加上參數(shù),

def g(f): print("這里是G") def h(*args,**kw):  print('這里是H')  return f(*args,**kw) return h@gdef f(*args,**kw): print("這里是F") return "1"'''>>>f(*args,**kw)等價(jià)于>>>g(f) (*args,**kw)g函數(shù)執(zhí)行,返回>>>h (*args,**kw)h函數(shù)執(zhí)行(打印日志)>>>f(*args,**kw)f執(zhí)行,返回1>>>1'''

可以看出,(*args,**kw)本改被h函數(shù)拿走,所以,觀察h函數(shù),h把它的參數(shù)原封不動(dòng)的交給了f

機(jī)智的我動(dòng)了歪主意

def g(f): print("這里是G") def h():#h沒要求參數(shù)  print('這里是H')  return f return h@gdef f(*args,**kw): print("這里是F") return "1"'''>>>f()(*args,**kw)等價(jià)于>>>g(f) ()(*args,**kw)g函數(shù)執(zhí)行,返回>>>h ()(*args,**kw)h函數(shù)執(zhí)行,h拿的空參數(shù)(打印日志)>>>f(*args,**kw)f執(zhí)行,返回1>>>1'''

可是新的問題來了,后面f調(diào)用的時(shí)候得多加個(gè)空括號(hào),否則

'''>>>f(*args,**kw)等價(jià)于>>>g(f) (*args,**kw)g函數(shù)執(zhí)行,返回>>>h (*args,**kw)h函數(shù)執(zhí)行(打印日志)返回f>>>f這是一個(gè)函數(shù)對(duì)象'''

以上告訴我們一個(gè)道理"函數(shù)執(zhí)行不執(zhí)行取決于后面有沒有括號(hào)"

舉個(gè)例子

def m(a): print(a) return mprint(m(1)(2)(3)(4)(5)(6)(7)(8)(9)(10))'''-----------------------------246810<function m at 0x000002832BDB10D0>

燒腦時(shí)刻

f = a.b.c()()[0]()[d()()[e]]

a模塊的b類的c方法是高階函數(shù),最終返回一個(gè)列表,列表里有個(gè)函數(shù)

函數(shù)又返回一個(gè)字典............

以上這篇淺談python裝飾器探究與參數(shù)的領(lǐng)取就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持VEVB武林網(wǎng)。


注:相關(guān)教程知識(shí)閱讀請(qǐng)移步到python教程頻道。
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 商河县| 新绛县| 习水县| 吉木萨尔县| 桃园县| 吴川市| 佛冈县| 庆元县| 无锡市| 兰坪| 驻马店市| 孝义市| 阳东县| 江津市| 河津市| 乌兰浩特市| 锡林浩特市| 富川| 瑞安市| 安徽省| 湘潭市| 左贡县| 富阳市| 云梦县| 三穗县| 九龙县| 临澧县| 南宁市| 扬中市| 门源| 昆山市| 河东区| 丰城市| 土默特左旗| 白玉县| 宜宾县| 江门市| 渝中区| 辽阳县| 克东县| 崇州市|