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

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

Python中的裝飾器

2019-11-14 16:59:53
字體:
來源:轉載
供稿:網友

                                                    Python中的裝飾器

假定現有如下需求:

已經定義了一個函數,想在運行時動態增加其功能,又不想改動函數本身的代碼。應該如何實現呢?
比如現在定義了f1函數如下:
  def f1(x):        return x*2    PRint f1(5)



那么,現在想加入一個打印日志的方法,打印出調用的是哪個方法的方法。一般做法是這樣:
    def f1(x):        print 'call f1()'        return x*2    print f1(5)



那有沒有更簡單明了的方法呢,我上篇博文中有寫的高階函數,那么我們想到高階函數是可以把函數當參數并且可以返回函數的。那么,再次,那么,是不是可以接收一個函數,對其進行一定包裝(比如此處加一個打印日志的功能),然后返回一個新函數呢?自然可以,請看:
    def new_fn(f):        def fn(x):            print 'call'+  f.__name__+'() by decorator'            return f(x)        return fn    f1=new_fn(f1)    print f1(5)

 
 
當然,Python給我們提供了語法糖,可以讓代碼看起來更簡潔一些的調用。我們只需要有裝飾器函數前加上“@”,然后在后面做相應調用原函數的操作就可以了。也就是這樣:
    def new_fn(f):        def fn(x):            print 'call' +f.__name__+'() using @'            return f(x)        return fn    @new_fn#這里也就是相當于上面的f1=new_fn(f1)弄成了這個樣子,寫習慣了就好了。    def f1(x):        return x*2    print f1(5)  

 
 
那用裝飾器有什么好處呢?
個人認為可以簡化代碼,比如要打印日志加上“@log”就好。并且其有點AOP的思想,類似于C#中MVC的Filter。
 
 
 
 
 

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 嵩明县| 天镇县| 清苑县| 财经| 平度市| 汾阳市| 阳泉市| 黑水县| 高唐县| 铜陵市| 乌恰县| 南阳市| 离岛区| 定陶县| 贵港市| 万全县| 鸡西市| 花垣县| 利川市| 钟祥市| 松江区| 永和县| 三河市| 石屏县| 双峰县| 新民市| 青海省| 科尔| 金平| 文化| 石首市| 安岳县| 库车县| 英超| 吴堡县| 岳阳市| 铜鼓县| 凌源市| 布拖县| 公主岭市| 阳高县|