python實(shí)現(xiàn)Decorator模式實(shí)例代碼
本文研究的主要是python實(shí)現(xiàn)Decorator模式,具體介紹如下。
一般來(lái)說(shuō),裝飾器是一個(gè)函數(shù),接受一個(gè)函數(shù)(或者類)作為參數(shù),返回值也是也是一個(gè)函數(shù)(或者類)。首先來(lái)看一個(gè)簡(jiǎn)單的例子:
# -*- coding: utf-8 -*- def log_cost_time(func): def wrapped(*args, **kwargs): import time begin = time.time() try: return func(*args, **kwargs) finally: print 'func %s cost %s' % (func.__name__, time.time() - begin) return wrapped @log_cost_time def complex_func(num): ret = 0 for i in xrange(num): ret += i * i return ret #complex_func = log_cost_time(complex_func) if __name__ == '__main__': print complex_func(100000) code snippet 0
代碼中,函數(shù)log_cost_time
就是一個(gè)裝飾器,其作用也很簡(jiǎn)單,打印被裝飾函數(shù)運(yùn)行時(shí)間。
裝飾器的語(yǔ)法如下:
@dec def func():pass
本質(zhì)上等同于: func = dec(func)
。
在上面的代碼(code snippet 0)中,把line12注釋掉,然后把line18的注釋去掉,是一樣的效果。另外staticmethod和classmethod是兩個(gè)我們經(jīng)常在代碼中用到的裝飾器,如果對(duì)pyc反編譯,得到的代碼一般也都是 func = staticmthod(func)
這種模式。當(dāng)然,@符號(hào)的形式更受歡迎些,至少可以少拼寫一次函數(shù)名。
實(shí)例代碼
#-*-coding:utf-8-*- ''' 意圖:動(dòng)態(tài)地給一個(gè)對(duì)象添加一些額外的職責(zé)。比通過(guò)生成子類更為靈活 ''' from abc import ABCMeta class Component(): __metaclass__ = ABCMeta def __init__(self): pass def operation(self): pass class ConcreteComponent(Component): def operation(self): print 'ConcreteComponent operation...' class Decorator(Component): def __init__(self, comp): self._comp = comp def operation(self): pass class ConcreteDecorator(Decorator): def operation(self): self._comp.operation() self.addedBehavior() def addedBehavior(self): print 'ConcreteDecorator addedBehavior...' if __name__ == "__main__": comp = ConcreteComponent() dec = ConcreteDecorator(comp) dec.operation()
結(jié)果
======================= RESTART: C:/Python27/0209.2.py =======================
ConcreteComponent operation...
ConcreteDecorator addedBehavior...
>>>
總結(jié)
以上就是本文關(guān)于python實(shí)現(xiàn)Decorator模式實(shí)例代碼的全部?jī)?nèi)容,希望對(duì)大家有所幫助。感興趣的朋友可以繼續(xù)參閱本站其他相關(guān)專題,如有不足之處,歡迎留言指出。感謝朋友們對(duì)本站的支持!
相關(guān)文章
Python輕松讀寫TOML文件實(shí)現(xiàn)示例
這篇文章主要介紹了Python輕松讀寫TOML文件實(shí)現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2024-01-01零基礎(chǔ)寫python爬蟲之使用urllib2組件抓取網(wǎng)頁(yè)內(nèi)容
文章詳細(xì)介紹了在python2.5環(huán)境下,如何使用urllib2這個(gè)python自帶的組件進(jìn)行抓取指定網(wǎng)頁(yè)內(nèi)容的,整個(gè)過(guò)程記錄的非常的詳細(xì),也很簡(jiǎn)單,有需要的朋友可以參考下,寫出自己的python爬蟲2014-11-11Python如何實(shí)現(xiàn)Paramiko的二次封裝
這篇文章主要介紹了Python如何實(shí)現(xiàn)Paramiko的二次封裝,幫助大家更好的理解和使用python,感興趣的朋友可以了解下2021-01-01python協(xié)程之動(dòng)態(tài)添加任務(wù)的方法
今天小編就為大家分享一篇python協(xié)程之動(dòng)態(tài)添加任務(wù)的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-02-02Python操作mongodb數(shù)據(jù)庫(kù)進(jìn)行模糊查詢操作示例
這篇文章主要介紹了Python操作mongodb數(shù)據(jù)庫(kù)進(jìn)行模糊查詢操作,結(jié)合實(shí)例形式分析了Python連接MongoDB數(shù)據(jù)庫(kù)及使用正則表達(dá)式進(jìn)行模糊查詢的相關(guān)操作技巧,需要的朋友可以參考下2018-06-06基于DataFrame篩選數(shù)據(jù)與loc的用法詳解
今天小編就為大家分享一篇基于DataFrame篩選數(shù)據(jù)與loc的用法詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-05-05