python lock_python lock一步步教你理解Python装饰器
請仔細看我們的decorator實例。我們定義了一個接受單個參數(shù)some_func的名為outer的函數(shù)。在outer內(nèi)部我們定義了一個名為inner的嵌套函數(shù)。inner函數(shù)打印一個字符串然后調(diào)用some_func,在#1處緩存它的返回值。some_func的值可能在每次outer被調(diào)用時不同,但是無論它是什么我們都將調(diào)用它。最終,inner返回some_func的返回值加1,并且我們可以看到,當我們調(diào)用存儲于#2處decorated里的返回函數(shù)時我們得到了輸出的文本和一個返回值2而不是我們期望的調(diào)用foo產(chǎn)生的原始值1.
我們可以說decorated變量是foo的一個“裝飾”版本——由foo加上一些東西構(gòu)成。實際上,如果我們寫了一個有用的decorator,我們可能想用裝飾后的版本來替換foo,從而可以得到foo的“增添某些東西”的版本。我們可以不用學習任何新語法而做到這一點——重新將包含我們函數(shù)的變量進行賦值:>>>?foo?=?outer(foo)
>>>?foo?#?doctest:?+ELLIPSIS
現(xiàn)在任何對foo()的調(diào)用都不會得到原始的foo,而是會得到我們經(jīng)過裝飾的版本!領(lǐng)悟到了一些decorator的思想嗎?
10、裝飾器的語法糖--@符號(The @ symbol applies a decorator to a function)
Python 2.4通過在函數(shù)定義前添加一個@符號實現(xiàn)對函數(shù)的包裝。在上面的代碼示例中,我們用一個包裝了的函數(shù)來替換包含函數(shù)的變量來實現(xiàn)了包裝。>>>?add?=?wrapper(add)
這一模式任何時候都可以用來包裝任何函數(shù),但是如果們定義了一個函數(shù),我們可以用@符號像下面示例那樣包裝它:>>>?@wrapper
...?def?add(a,?b):
...?????return?Coordinate(a.x?+?b.x,?a.y?+?b.y)
請注意,這種方式和用wrapper函數(shù)的返回值來替換原始變量并沒有任何不同,Python只是增添了一些語法糖(syntactic sugar)讓它看起來更明顯一點。
11、*args and **kwargs
我們已經(jīng)寫了一個有用的decorator,但是它是硬編碼的,它只適用于特定種類的函數(shù)——帶有兩個參數(shù)的函數(shù)。我們函數(shù)內(nèi)部的checker函數(shù)接受了兩個參數(shù),然后繼續(xù)將參數(shù)閉包里的函數(shù)。如果我們想要一個能包裝任何類型函數(shù)的decorator呢?讓我們實現(xiàn)一個在不改變被包裝函數(shù)的前提下對每一次被包裝函數(shù)的調(diào)用增添一次計數(shù)的包裝器。這意味著這個decorator需要接受所有待包裝的任何函數(shù)并將傳遞給它的任何參數(shù)傳遞給被包裝的函數(shù)來調(diào)用它(被包裝的函數(shù))。
這種情況很常見,所以Python為這一特性提供了語法支持。請確保閱讀Python Tutorial以了解更多,但是在函數(shù)定義時使用*運算符意味著任何傳遞給函數(shù)的額外位置參數(shù)最終以一個*作為前導。因此:>>>?def?one(*args):
...?????print?args?#?1
>>>?one()
()
>>>?one(1,?2,?3)
(1,?2,?3)
>>>?def?two(x,?y,?*args):?#?2
...?????print?x,?y,?args
>>>?two('a',?'b',?'c')
a?b?('c')
第一個函數(shù)one只是簡單的將任何(如果有)傳遞給它的位置參數(shù)打印出來。正如你在#1處見到的,在函數(shù)內(nèi)部我們只是引用了args變量——*args只是表明在函數(shù)定義中位置參數(shù)應該保存在變量args中。Python也允許我們指定一些變量并捕獲到任何在args變量里的其它參數(shù),正如#2處所示。
*運算符也可以用于函數(shù)調(diào)用中,這時它也有著類似的意義。在調(diào)用一個函數(shù)時帶有一個以*為前導的變量作為參數(shù)表示這個變量內(nèi)容需要被解析然后用作位置參數(shù)。再一次以實例來說明:>>>?def?add(x,?y):
...?????return?x?+?y
>>>?lst?=?[1,?2]
>>>?add(lst[0],?lst[1])?#?1
3
>>>?add(*lst)?#?2
3
#1處的代碼抽取出了和#2處相同的參數(shù)——在#2處Python為我們自動解析了參數(shù),我們也可以像在#1處一樣自己解析出來。這看起來不錯,*args既表示當調(diào)用函數(shù)是從一個iterable抽取位置參數(shù),也表示當定義一個函數(shù)是接受任何額外的位置變量。
當我們引入**時,事情變得更加復雜點,與*表示iterables和位置參數(shù)一樣,**表示dictionaries & key/value對。很簡單,不是么?>>>?def?foo(**kwargs):
...?????print?kwargs
>>>?foo()
{}
>>>?foo(x=1,?y=2)
{'y':?2,?'x':?1}
更多:python lock一步步教你理解Python裝飾器
https://www.002pc.comhttps://www.002pc.com/python/818.html
你可能感興趣的Python,一步步,裝飾,理解
mysql 查出數(shù)據(jù)一對多python使用unittest測試接口步奏詳解
這次給大家?guī)韕ython使用unittest測試接口步奏詳解,python使用unittest測試接口的注意事項有哪些,下面就是實戰(zhàn)案例,一起來看一下。
win7開始菜單 圖標只需兩步實現(xiàn)Windows7系統(tǒng)自動撥號
第一步:建立撥號連接
我們新建一個寬帶連接(開始->控制面板->網(wǎng)絡和Internet->查看網(wǎng)絡狀態(tài)和任務》設置新的連接或網(wǎng)絡-> 連接到 Internet->
互聯(lián)網(wǎng)公司項目總監(jiān)制造業(yè)網(wǎng)絡發(fā)展勢頭較好 張峰四點提議助力下一步持續(xù)發(fā)展
《互聯(lián)網(wǎng)公司項目總監(jiān)制造業(yè)網(wǎng)絡發(fā)展勢頭較好 張峰四點提議助力下一步持續(xù)發(fā)展》總結(jié)了關(guān)于學習電腦教程,對于我們來sfk8網(wǎng)確實能學到不少知識。飛象網(wǎng)訊(九月/文中)現(xiàn)階段,一連
gta5手機互聯(lián)網(wǎng)連接七星基本上該系統(tǒng)星圖布署已完成 邁進南北全世界關(guān)鍵性一步
七星四號基本上該系統(tǒng)星圖布署圓滿完成,我國七星邁進從國外南北國際性、從區(qū)域內(nèi)南北全世界的“關(guān)鍵性一步”。“七
互聯(lián)網(wǎng) 旅游 實習IMT-2020(5S)前進兩組追加兩個專家組:車聯(lián)網(wǎng)成為下一步重點項目
sfk8網(wǎng)認為此文章對《互聯(lián)網(wǎng) 旅游 實習IMT-2020(5S)前進兩組追加兩個專家組:車聯(lián)網(wǎng)成為下一步重點項目》說的很在理。
linux 命令查看用戶教你三步修改linux 主機名
修改 Linux 主機名需要3步。電腦技術(shù)002pc網(wǎng)認為此文章對《linux 命令查看用戶教你三步修改linux 主機名》說的很在理,第二電腦
怎么dos硬盤安裝xpwindowsXP 20步詳細配置
XP配置20步,申精!
1.察看本地共享資源 運行CMD輸入net share,如果看到有異常的共享,那么應該關(guān)閉。但是有時你關(guān)閉共享下次開機的時候又出現(xiàn)了,那么你應該考慮一下,你
家庭接入互聯(lián)網(wǎng)2018年dSIM卡不會跑到哪一步?
飛象網(wǎng)訊(兩匹大友/文)1月底2日消息,dSIM卡早在2011年就被提到,新技術(shù)持續(xù)發(fā)展沒問題,也是一個較為準確的趨勢。但走到3S、穿過4S,5S也要來了,eSIM新技術(shù)一直沒推展起來。這個完全
怎么給電腦安裝字體手動搭建屬于自己的博客 -- 第一步
本來想搞點幽默又不失水平的開場白,敲了一行字果斷刪了,我果然不適合寫點啥,咱還是干實事吧!
今年暑假8月份在家閑著沒事,就想搭建一個個人博客看看,前前后后花了大概2-3天吧,畢竟
0踩
賞
0 贊
總結(jié)
以上是生活随笔為你收集整理的python lock_python lock一步步教你理解Python装饰器的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 亚马逊哪些产品要爆火亚马逊哪些产品要爆火
- 下一篇: python choice添加下拉框_自