国产探花免费观看_亚洲丰满少妇自慰呻吟_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。
 
 
 
 
 

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 淄博市| 来凤县| 湖北省| 乌苏市| 营口市| 汾西县| 阿拉善盟| 松滋市| 河南省| 沙雅县| 玉溪市| 涟水县| 横峰县| 深水埗区| 三门峡市| 银川市| 定远县| 札达县| 大关县| 桂平市| 巨野县| 东乡县| 鄯善县| 镇远县| 大丰市| 马山县| 陵水| 烟台市| 大悟县| 白朗县| 独山县| 临武县| 扶沟县| 吉首市| 西充县| 慈溪市| 双柏县| 北京市| 福清市| 治多县| 常熟市|