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