python函數(shù)裝飾器用法實(shí)例詳解
本文實(shí)例講述了python函數(shù)裝飾器用法。分享給大家供大家參考。具體如下:
裝飾器經(jīng)常被用于有切面需求的場景,較為經(jīng)典的有插入日志、性能測試、事務(wù)處理等。裝飾器是解決這類問題的絕佳設(shè)計(jì),
有了裝飾器,我們就可以抽離出大量函數(shù)中與函數(shù)功能本身無關(guān)的雷同代碼并繼續(xù)重用。概括的講,裝飾器的作用就是為已經(jīng)存在的對象添加額外的功能。
#! coding=utf-8
import time
def timeit(func):
def wrapper(a):
start = time.clock()
func(1,2)
end =time.clock()
print 'used:', end - start
print a
return wrapper
@timeit
# foo = timeit(foo)完全等價,
# 使用之后,foo函數(shù)就變了,相當(dāng)于是wrapper了
def foo(a,b):
pass
#不帶參數(shù)的裝飾器
# wraper 將fn進(jìn)行裝飾,return wraper ,返回的wraper 就是裝飾之后的fn
def test(func):
def wraper():
print "test start"
func()
print "end start"
return wraper
@test
def foo():
print "in foo"
foo()
輸出:
test start in foo end start
裝飾器修飾帶參數(shù)的函數(shù):
def parameter_test(func):
def wraper(a):
print "test start"
func(a)
print "end start"
return wraper
@parameter_test
def parameter_foo(a):
print "parameter_foo:"+a
#parameter_foo('hello')
輸出:
>>> test start parameter_foo:hello end start
裝飾器修飾不確定參數(shù)個數(shù)的函數(shù):
def much_test(func):
def wraper(*args, **kwargs):
print "test start"
func(*args, **kwargs)
print "end start"
return wraper
@much_test
def much1(a):
print a
@much_test
def much2(a,b,c,d ):
print a,b,c,d
much1('a')
much2(1,2,3,4)
輸出:
test start a end start test start 1 2 3 4 end start
帶參數(shù)的裝飾器,再包一層就可以了:
def tp(name,age):
def much_test(func):
print 'in much_test'
def wraper(*args, **kwargs):
print "test start"
print str(name),'at:'+str(age)
func(*args, **kwargs)
print "end start"
return wraper
return much_test
@tp('one','10')
def tpTest(parameter):
print parameter
tpTest('python....')
輸出:
in much_test test start one at:10 python.... end start
class locker:
def __init__(self):
print("locker.__init__() should be not called.")
@staticmethod
def acquire():
print("locker.acquire() called.(這是靜態(tài)方法)")
@staticmethod
def release():
print("locker.release() called.(不需要對象實(shí)例")
def deco(cls):
'''cls 必須實(shí)現(xiàn)acquire和release靜態(tài)方法'''
def _deco(func):
def __deco():
print("before %s called [%s]." % (func.__name__, cls))
cls.acquire()
try:
return func()
finally:
cls.release()
return __deco
return _deco
@deco(locker)
def myfunc():
print(" myfunc() called.")
myfunc()
輸出:
>>> before myfunc called [__main__.locker]. locker.acquire() called.(這是靜態(tài)方法) myfunc() called. locker.release() called.(不需要對象實(shí)例 >>>
class mylocker:
def __init__(self):
print("mylocker.__init__() called.")
@staticmethod
def acquire():
print("mylocker.acquire() called.")
@staticmethod
def unlock():
print(" mylocker.unlock() called.")
class lockerex(mylocker):
@staticmethod
def acquire():
print("lockerex.acquire() called.")
@staticmethod
def unlock():
print(" lockerex.unlock() called.")
def lockhelper(cls):
'''cls 必須實(shí)現(xiàn)acquire和release靜態(tài)方法'''
def _deco(func):
def __deco(*args, **kwargs):
print("before %s called." % func.__name__)
cls.acquire()
try:
return func(*args, **kwargs)
finally:
cls.unlock()
return __deco
return _deco
class example:
@lockhelper(mylocker)
def myfunc(self):
print(" myfunc() called.")
@lockhelper(mylocker)
@lockhelper(lockerex)
def myfunc2(self, a, b):
print(" myfunc2() called.")
return a + b
if __name__=="__main__":
a = example()
a.myfunc()
print(a.myfunc())
print(a.myfunc2(1, 2))
print(a.myfunc2(3, 4))
輸出:
before myfunc called. mylocker.acquire() called. myfunc() called. mylocker.unlock() called. before myfunc called. mylocker.acquire() called. myfunc() called. mylocker.unlock() called. None before __deco called. mylocker.acquire() called. before myfunc2 called. lockerex.acquire() called. myfunc2() called. lockerex.unlock() called. mylocker.unlock() called. 3 before __deco called. mylocker.acquire() called. before myfunc2 called. lockerex.acquire() called. myfunc2() called. lockerex.unlock() called. mylocker.unlock() called. 7
希望本文所述對大家的Python程序設(shè)計(jì)有所幫助。
- python裝飾器相當(dāng)于函數(shù)的調(diào)用方式
- python函數(shù)裝飾器之帶參數(shù)的函數(shù)和帶參數(shù)的裝飾器用法示例
- Python函數(shù)裝飾器原理與用法詳解
- 讓你Python到很爽的加速遞歸函數(shù)的裝飾器
- Python裝飾器限制函數(shù)運(yùn)行時間超時則退出執(zhí)行
- 使用python裝飾器計(jì)算函數(shù)運(yùn)行時間的實(shí)例
- python裝飾器-限制函數(shù)調(diào)用次數(shù)的方法(10s調(diào)用一次)
- 淺析Python編寫函數(shù)裝飾器
- python使用裝飾器和線程限制函數(shù)執(zhí)行時間的方法
- Python中利用函數(shù)裝飾器實(shí)現(xiàn)備忘功能
- python通過裝飾器檢查函數(shù)參數(shù)數(shù)據(jù)類型的方法
- Python如何創(chuàng)建裝飾器時保留函數(shù)元信息
相關(guān)文章
python命令行參數(shù)argparse模塊基本用法詳解
argparse?是python自帶的命令行參數(shù)解析包,可以用來方便地讀取命令行參數(shù),這篇文章主要介紹了python命令行參數(shù)-argparse模塊基本用法,需要的朋友可以參考下2023-01-01
使用Python實(shí)現(xiàn)跳一跳自動跳躍功能
這篇文章主要介紹了使用Python實(shí)現(xiàn)跳一跳自動跳躍功能,本文圖文并茂通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下2019-07-07
PyTorch中的squeeze()和unsqueeze()解析與應(yīng)用案例
這篇文章主要介紹了PyTorch中的squeeze()和unsqueeze()解析與應(yīng)用案例,文章內(nèi)容介紹詳細(xì),需要的小伙伴可以參考一下,希望對你有所幫助2022-03-03
python文字轉(zhuǎn)語音的實(shí)例代碼分析
在本篇文章里小編給大家整理的是關(guān)于python文字轉(zhuǎn)語音的實(shí)例代碼分析,有需要的朋友們可以參考下。2019-11-11
Python3實(shí)現(xiàn)取圖片中特定的像素替換指定的顏色示例
這篇文章主要介紹了Python3實(shí)現(xiàn)取圖片中特定的像素替換指定的顏色,涉及Python3針對圖片文件的讀取、轉(zhuǎn)換、生成等相關(guān)操作技巧,需要的朋友可以參考下2019-01-01
python中DataFrame常用的描述性統(tǒng)計(jì)分析方法詳解
這篇文章主要介紹了python中DataFrame常用的描述性統(tǒng)計(jì)分析方法詳解,描述性統(tǒng)計(jì)分析是通過圖表或數(shù)學(xué)方法,對數(shù)據(jù)資料進(jìn)行整理、分析,并對數(shù)據(jù)的分布狀態(tài)、數(shù)字特征和隨機(jī)變量之間的關(guān)系進(jìn)行估計(jì)和描述的方法,需要的朋友可以參考下2023-07-07
python 解決selenium 中的 .clear()方法失效問題
這篇文章主要介紹了python 解決selenium 中的 .clear()方法失效問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-09-09
python多進(jìn)程實(shí)現(xiàn)數(shù)據(jù)共享的示例代碼
本文介紹了Python中多進(jìn)程實(shí)現(xiàn)數(shù)據(jù)共享的方法,包括使用multiprocessing模塊和manager模塊這兩種方法,具有一定的參考價值,感興趣的可以了解一下2025-01-01

