python裝飾器

裝飾器本質是一個裝飾器函數,在不改變一個函數的函數體本身的情況下,實現函數體本身外其他的功能
1.實現一個裝飾器
def ?logger(fn): ? ? ? ? ? ? ? ? ? ? ? ? #裝飾器函數必須只能傳入一個參數,那就是被裝飾函數
????print(‘in’)
????def wrapper(*args,**kwargs):
?? ?? ? print(‘before’)
????????ret = fn(*args,**kwargs)
?? ?? ? print(‘after’)
????????return ret
????return wrapper
@logger
def foo3(x=3,y=4): ? ? ? #相當于 ? foo3=logger(foo3)
? ? ”’i’m foo3”’
????print(x,y)
?代碼在加載時就會打印 ?‘in’
執行foo3函數相當于執行下面的函數 ? ?執行foo3(參數) ,args 和kwargs會獲取實際輸入的位置參數和關鍵字參數,然后傳給原函數中調用(它不會獲取原函數中的默認參數值,但這不會改變函數執行結果).
def wrapper(*args,**kwargs):
? ? print(‘before’)
? ? ret = foo3(*args,**kwargs)
? ? print(‘after’)
? ? return ret
2.文檔字符串 和 帶參數的裝飾器
一個函數定義之后就會有對應的文檔字符(.__doc__)等屬性生成. 裝飾器函數包裝過后,獲取不到原函數的各種屬性就變成了wrapper對應的屬性
下面使用了一個帶有參數的裝飾器把wrapper 函數裝飾成一個新的wrapper函數,這里使用到了一個帶有參數的裝飾器
代碼2.1:
def copy_properties(src):
?? ?def _copy(dst):
?? ??? ?dst.__name__ = src.__name__
?? ??? ?dst.__doc__ = src.__doc__
?? ??? ?return dst
?? ?return _copy
def logger(fn):
?? ?@copy_properties(fn) ? ? ? ? ?# wrapper = wrapper(fn)(wrapper)
?? ?def wrapper(*args,**kwargs):
?? ??? ??‘I am wrapper’
?? ??? ?print(‘begin’)
?? ??? ?x = fn(*args,**kwargs)
?? ??? ?print(‘end’)
?? ??? ?return x
?? ??return wrapper
@logger ? ? ? ? ? ?#add = logger(add)
?def add(x,y):
?? ??”’This is a function for add”’
?? ??? ??return x + y
?print(“name={}, doc={}”.format(add.__name__, add.__doc__))
代碼2.2:
def copy_property(src):
????def _copy(dst):
?? ?? ? print(11)
????????dst.__name__ = src.__name__
????????dst.__doc__ = src.__doc__
????????return dst
????return _copy
def add(x,y):
????”’i am add”’
????print(x,y)
????return x+y
@copy_property(add)
def wrapper(*args,**kwargs): ? ? ? ?#wrapper = cop_property(add) (wrapper)
????”’i am wrapper”’
? ? print(22)
????ret = add(*args,**kwargs)
????return ret
print(add.__name__,add.__doc__)
print(wrapper.__name__,wrapper.__doc__)
運行代碼2.2 ?會加載裝飾器 運行右邊的?wrapper = cop_property(add) (wrapper)?程序 ?,add的屬性會賦給 wrapper,打印如下.
11?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?? 如果執行wrapper(2,3) ?會 先打印 22,然后執行add中的過程
add i am add
add i am add
3.對一個函數使用多個裝飾器
def decorator1(func):
????print(11)
????def wrapper1(*args,**kwargs):
????????print(‘hello python 之前’)
????????ret=func(*args,**kwargs)
????????return ret
????return wrapper1
def decorator2(func):
????print(22)
????def wrapper2(*args,**kwargs):
????????print(‘hello python 之后’)
????????ret=func(*args,**kwargs)
????????return ret
????return wrapper2
@decorator1
@decorator2
def test(x,y):
????print(‘hello python!’,x,y)
test(4,5)
22 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 對一個函數執行多個裝飾器,執行結果相當于對decorator2裝飾test的函數 再使用decorator1裝飾它
11
hello python 之前
hello python 之后
hello python! 4 5

本文來自投稿,不代表Linux運維部落立場,如若轉載,請注明出處:http://www.www58058.com/88032

(0)
daishitongdaishitong
上一篇 2017-10-23 14:47
下一篇 2017-10-23 22:58

相關推薦

  • 運維監控大數據的提取與分析

    本文內容整理來自【敏捷運維大講堂】蔣君偉老師的線上直播分享。分別從以下3個維度來分享:1、云時代監控分析的窘境;2、使用標簽標記監控數據的維度;3、監控數據應用場景。 云時代監控分析的窘境 在虛擬化與容器技術廣泛應用的情況下,運維對象大規模地增長,監控平臺每天存儲的指標都以億計,所以監控數據如今已經成了大數據。傳統的監控工具在這種場景下,對于數據的提取分析,…

    系統運維 2017-01-09
  • 78 款 Markdown 工具

    Markdown 是一種易寫易讀的文本標記語言。本文介紹了編寫、查看 Markdown 的78種工具,涵蓋桌面端、移動端和 web 端。     Markable 強大的在線 Markdown 編輯器,支持語法高亮、自動縮進、高亮所在行、顯示行數、即時預覽。它支持將 HTML 轉換成 Markdown。 可以配合 Evernote、Dro…

    2015-03-26
  • raid介紹

    raid介紹 在生產環境中,服務器所需的存儲容量比較大,一般都會選擇磁盤陣列來走存儲。 陣列的優點 多個磁盤合成一個“陣列”來提供更好的性能、冗余,或者兩者都提供 首先在I/O能力上,多個磁盤并行讀寫,可以提高讀寫的速度。 陣列所提供的磁盤冗余,提升存儲設配的耐用性。 RAID實現的 外接式磁盤陣列:通過擴展卡提供適配能力 內接式RAID:主板集成RAID控…

    2017-06-24
  • 第三周作業

    1.列出當前系統上所有已經登錄的用戶的用戶名,注意:同一個用戶登錄多次,則只顯示一次即可。  2、取出最后登錄到當前系統的用戶的相關信息。  3、取出當前系統上被用戶當作其默認shell的最多的那個shell。  4、將/etc/passwd中的第三個字段數值最大的后10個用戶的信息全部改為大寫后保存至/tmp/max…

    Linux干貨 2016-12-21
  • ?從實驗來了解grub

    實驗一為grub設置密碼 先看一看grub是怎么樣的 grub有兩個版本 grub: GRand Unified Bootloader grub 0.x: grub legacy grub 1.x: grub2  Note:grub 1.x是完全重寫的只不過是保留grub 0.x的工作機制。 2.利用grub自帶命令生成密碼grub-md5-cry…

    Linux干貨 2016-06-09
  • Linux獲取命令幫助方法全攬

    Linux獲取命令幫助方法全攬 Linux命令分類 內置命令:shell程序自帶的命令 外部命令:獨立的可執行程序,在linux系統中存在與命令名稱相同的可執行文件,需要shell程序通過環境變量解析到對應的可執行性文件后才可執行 可使用type COMMAND查看命令的分類 獲取幫助的方法 內置命令獲取幫助 命令格式:help COMMAND 外部命令獲取…

    Linux干貨 2017-07-02
欧美性久久久久