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?實(shí)現(xiàn)syslog?服務(wù)器的詳細(xì)過(guò)程
這篇文章主要介紹了python?實(shí)現(xiàn)syslog服務(wù)器的詳細(xì)過(guò)程,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-08-08
Python使用apscheduler模塊設(shè)置定時(shí)任務(wù)的實(shí)現(xiàn)
本文主要介紹了Python使用apscheduler模塊設(shè)置定時(shí)任務(wù)的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-05-05
Python?按規(guī)則解析并替換字符串中的變量及函數(shù)(示例代碼)
這篇文章主要介紹了Python?按規(guī)則解析并替換字符串中的變量及函數(shù),本文通過(guò)示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-11-11
詳解Python中的函數(shù)參數(shù)傳遞方法*args與**kwargs
本文將討論P(yáng)ython的函數(shù)參數(shù)。我們將了解args和kwargs,/和的都是什么,雖然這個(gè)問(wèn)題是一個(gè)基本的python問(wèn)題,但是在我們寫代碼時(shí)會(huì)經(jīng)常遇到,比如timm中就大量使用了這樣的參數(shù)傳遞方式2023-03-03
簡(jiǎn)單了解Python下用于監(jiān)視文件系統(tǒng)的pyinotify包
這篇文章主要介紹了Python下用于監(jiān)視文件系統(tǒng)的pyinotify包,pyinotify基于inotify事件驅(qū)動(dòng)機(jī)制,需要的朋友可以參考下2015-11-11
Python-with open() as f的用法及說(shuō)明
這篇文章主要介紹了Python-with open() as f的用法及說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-12-12
Django后端接收嵌套Json數(shù)據(jù)及解析詳解
這篇文章主要介紹了Django后端接收嵌套Json數(shù)據(jù)及解析詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-07-07
numpy求矩陣的特征值與特征向量(np.linalg.eig函數(shù)用法)
這篇文章主要介紹了numpy求矩陣的特征值與特征向量(np.linalg.eig函數(shù)用法),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-02-02
python3.8與pyinstaller沖突問(wèn)題的快速解決方法
這篇文章主要介紹了python3.8與pyinstaller沖突問(wèn)題及解決方法,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-01-01

