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

首頁 > 學院 > 開發設計 > 正文

Python札記--裝飾器補充

2019-11-14 17:34:31
字體:
來源:轉載
供稿:網友

    本隨筆是對Python札記 -- 裝飾器的一些補充。

    使用裝飾器的時候,被裝飾函數的一些屬性會丟失,比如如下代碼:

 1 #!/usr/bin/env python 2  3 def deco(func): 4     def wrapper(): 5         PRint "Wrap start" 6         func() 7         print "Wrap end/n" 8     return wrapper 9 10 @deco11 def foo():12     """Docstring for foo"""13     print "In foo():"14 15 foo()16 print foo.__name__17 print foo.__doc__

輸出如下:

$ python decorator_test.pyWrap startIn foo():Wrap endwrapperNone

可以發現,__name__屬性成了wrapper,而__doc__屬性則成了None。這對于平常使用多少帶來些不便,總不能給每個使用裝飾器的函數都重寫__name__和__doc__吧。

    Python的functools提供的update_wrapper和wraps可以有效解決這個問題。不過update_wrapper是用方法的形式進行調用,而wraps則是用裝飾器來封裝了update_wrapper。示例代碼分別如下:

 1 #!/usr/bin/env python 2 from functools import update_wrapper 3  4 def deco(func): 5     def wrapper(): 6         print "Wrap start" 7         func() 8         print "Wrap end/n" 9     return update_wrapper(wrapper,func) #調用update_wrapper方法10 11 @deco12 def foo():13     """Docstring for foo"""14     print "In foo():"15 16 foo()17 print foo.__name__18 print foo.__doc__
 1 #!/usr/bin/env python 2 from functools import wraps 3  4 def deco(func): 5     @wraps(func) #使用裝飾器來實現 6     def wrapper(): 7         print "Wrap start" 8         func() 9         print "Wrap end/n"10     return wrapper11 12 @deco13 def foo():14     """Docstring for foo"""15     print "In foo():"16 17 foo()18 print foo.__name__19 print foo.__doc__

現在被deco裝飾過的foo方法,可以保留之前的__name__和__doc__屬性了。

$ python decorator_test_with_update_wrapper.pyWrap startIn foo():Wrap endfooDocstring for foo$ python decorator_test_with_wraps.pyWrap startIn foo():Wrap endfooDocstring for foo

 


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 保山市| 高邑县| 通辽市| 苏州市| 静海县| 博野县| 阿瓦提县| 安多县| 治县。| 安顺市| 盱眙县| 甘德县| 滦南县| 正蓝旗| 于都县| 济源市| 永登县| 绥中县| 正阳县| 阿拉善右旗| 黑水县| 武夷山市| 临泉县| 中阳县| 北川| 丰顺县| 阳曲县| 会同县| 科技| 鄄城县| 刚察县| 睢宁县| 休宁县| 甘洛县| 阿克| 桃园市| 嘉祥县| 白山市| 旬阳县| 凤阳县| 镇江市|