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
下一篇 2017-10-23

相關推薦

  • Linux基礎知識之GUN awk

    awk:報告生成器,格式化文本輸出    基本用法:    gawk [options] 'program' FILE …    options:     &…

    Linux干貨 2016-09-20
  • N25期—第一周作業

    1、描述計算機的組成及其功能 計算機五大組成部件:運算器、控制器、存儲器、輸入設備和輸出設備。 運算器和控制器統稱中央處理器(CPU)。  存儲器分成內存儲器和外存儲器兩大類。  外存儲器、輸入設備和輸出設備統稱為外部設備。  中央處理器(CPU)  計算機的中央處理器又稱為CPU,它是計算機的核心部分。主要由運算器和…

    Linux干貨 2016-12-04
  • linux文件基本權限、默認權限、隱藏權限和ACL權限

    基本權限    文件屬性rwx     每個文件當用ls -l查看時,都會顯示文件的詳細屬性信息,其中在排在首位的共有10位字符信息     例如 -rw-r–rw-. 1 root root …….. 共有10位,第一位代表的是文件的類型,后邊9位表示的是文件的…

    Linux干貨 2016-08-04
  • MAN手冊使用指南及快捷鍵鍵位整理

      MAN手冊使用指南及快捷鍵鍵位整理 Man mnual 手冊說明          基本使用:man 命令 Man一共可分為八個章節: man1,man2,man3,man4……man8 1:用戶命令 2:系統調用 3:C庫調用 4:設備文件及特殊文件 5:文件格式…

    Linux干貨 2016-10-18
  • Linux運維實戰之2-2:bash的工作特性

    這次博文我們主要來談談bash的工作特性哈。 主要內容: bash是一種shell解釋程序     bash工作特性之命令狀態返回值 bash工作特性之命令行展開 bash工作特性之命令補全 bash工作特性之路徑補齊 bash工作特性之命令引用 bash工作特性之命令別名 bash工作特性之文件名通配 bash工作特性之命令hash 問…

    Linux干貨 2016-11-06
  • linux發展史——獸人永不為奴

      了解歷史才能判斷趨勢。既然我們已經打算跳入運維這個坑,了解先烈的歷史事跡是必須的。為什么說是必須的呢?現在我們處于一個知識時代,資本在追著知識跑,像海銀資本這種vc都看不起中國的市場了,已經帶著中國的資本在萬惡資本主義的老美投資了。 1計算機硬件組成   操作系統成為了非常重要人類創造生產力的場所,很多人都開始追本…

    Linux干貨 2016-10-14
欧美性久久久久