国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 編程 > Python > 正文

python函數(shù)裝飾器用法實(shí)例詳解

2019-11-25 17:18:45
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

本文實(shí)例講述了python函數(shù)裝飾器用法。分享給大家供大家參考。具體如下:

裝飾器經(jīng)常被用于有切面需求的場(chǎng)景,較為經(jīng)典的有插入日志、性能測(cè)試、事務(wù)處理等。裝飾器是解決這類問(wèn)題的絕佳設(shè)計(jì),
有了裝飾器,我們就可以抽離出大量函數(shù)中與函數(shù)功能本身無(wú)關(guān)的雷同代碼并繼續(xù)重用。概括的講,裝飾器的作用就是為已經(jīng)存在的對(duì)象添加額外的功能。

#! 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)完全等價(jià), # 使用之后,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ù)個(gè)數(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.(不需要對(duì)象實(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.(不需要對(duì)象實(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.Nonebefore __deco called.mylocker.acquire() called.before myfunc2 called.lockerex.acquire() called. myfunc2() called. lockerex.unlock() called. mylocker.unlock() called.3before __deco called.mylocker.acquire() called.before myfunc2 called.lockerex.acquire() called. myfunc2() called. lockerex.unlock() called. mylocker.unlock() called.7

希望本文所述對(duì)大家的Python程序設(shè)計(jì)有所幫助。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 横山县| 嘉定区| 徐闻县| 韶山市| 宜阳县| 长寿区| 扬中市| 叙永县| 昌乐县| 牡丹江市| 收藏| 监利县| 陆良县| 泰顺县| 栖霞市| 应城市| 奉新县| 饶阳县| 民丰县| 邯郸县| 桐梓县| 泸定县| 龙井市| 乐山市| 江孜县| 平武县| 临海市| 淅川县| 聂拉木县| 沂南县| 宣城市| 富蕴县| 兴隆县| 宁河县| 台北市| 桃源县| 穆棱市| 黔江区| 咸阳市| 台中市| 阿克陶县|