麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 編程 > Python > 正文

Python中的裝飾器用法詳解

2020-02-23 06:20:54
字體:
來源:轉載
供稿:網友

本文實例講述了Python中的裝飾器用法。分享給大家供大家參考。具體分析如下:

這里還是先由stackoverflow上面的一個問題引起吧,如果使用如下的代碼:
代碼如下:@makebold
@makeitalic
def say():
   return "Hello"
打印出如下的輸出:

<b><i>Hello<i></b>
你會怎么做?最后給出的答案是:
代碼如下:def makebold(fn):
    def wrapped():
        return "<b>" + fn() + "</b>"
    return wrapped
 
def makeitalic(fn):
    def wrapped():
        return "<i>" + fn() + "</i>"
    return wrapped
 
@makebold
@makeitalic
def hello():
    return "hello world"
 
print hello() ## 返回 <b><i>hello world</i></b>
現在我們來看看如何從一些最基礎的方式來理解Python的裝飾器。

裝飾器是一個很著名的設計模式,經常被用于有切面需求的場景,較為經典的有插入日志、性能測試、事務處理等。裝飾器是解決這類問題的絕佳設計,有了裝飾器,我們就可以抽離出大量函數中與函數功能本身無關的雷同代碼并繼續重用。概括的講,裝飾器的作用就是為已經存在的對象添加額外的功能。

1.1. 需求是怎么來的?

裝飾器的定義很是抽象,我們來看一個小例子。
代碼如下:def foo():
    print 'in foo()'
foo()
這是一個很無聊的函數沒錯。但是突然有一個更無聊的人,我們稱呼他為B君,說我想看看執行這個函數用了多長時間,好吧,那么我們可以這樣做:
代碼如下:import time
def foo():
    start = time.clock()
    print 'in foo()'
    end = time.clock()
    print 'used:', end - start
 
foo()
很好,功能看起來無懈可擊。可是蛋疼的B君此刻突然不想看這個函數了,他對另一個叫foo2的函數產生了更濃厚的興趣。

怎么辦呢?如果把以上新增加的代碼復制到foo2里,這就犯了大忌了~復制什么的難道不是最討厭了么!而且,如果B君繼續看了其他的函數呢?

1.2. 以不變應萬變,是變也

還記得嗎,函數在Python中是一等公民,那么我們可以考慮重新定義一個函數timeit,將foo的引用傳遞給他,然后在timeit中調用foo并進行計時,這樣,我們就達到了不改動foo定義的目的,而且,不論B君看了多少個函數,我們都不用去修改函數定義了!
代碼如下:import time
 
def foo():
    print 'in foo()'
 

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 亚洲操比视频 | 精品国产三级a | h色视频网站 | 久久丝袜脚交足黄网站免费 | 国产一级中文字幕 | 视频国产一区二区 | 亚洲欧美国产精品va在线观看 | 狠狠干91 | 日本欧美一区二区三区在线播 | 日韩欧美精品中文字幕 | 国产成人精品免高潮在线观看 | 久草成人在线观看 | 综合日韩av | 国产精品视频自拍 | 成人毛片100部 | 欧美18—19sex性hd按摩 | 久草导航| 国产毛片毛片 | 成品片a免费直接观看 | 久久久久女人精品毛片九一 | 草久影视 | 久久91精品视频 | 亚洲成人中文字幕在线 | 色婷婷一区二区三区 | 成人精品一区二区三区中文字幕 | 麻豆国产一区 | 91久久在线观看 | 中文字幕免费在线观看视频 | 91av久久 | 亚洲精品午夜国产va久久成人 | 青青草成人影视 | 久久精品国产99国产精品澳门 | 伊人二本二区 | 国内xxxx乱子另类 | 久章草在线视频 | 精品国产91久久久久久久妲己 | 日本黄色a视频 | 欧产日产国产精品乱噜噜 | 久久精品成人免费国产片桃视频 | 日韩剧情片 | 依人在线视频 |