熱線電話:13121318867

登錄
首頁精彩閱讀python函數裝飾器用法實例詳解
python函數裝飾器用法實例詳解
2018-01-16
收藏

python函數裝飾器用法實例詳解

本文實例講述了python函數裝飾器用法。分享給大家供大家參考。具體如下:
裝飾器經常被用于有切面需求的場景,較為經典的有插入日志、性能測試、事務處理等。裝飾器是解決這類問題的絕佳設計,
有了裝飾器,我們就可以抽離出大量函數中與函數功能本身無關的雷同代碼并繼續重用。概括的講,裝飾器的作用就是為已經存在的對象添加額外的功能。    
#! 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函數就變了,相當于是wrapper了
def foo(a,b):
  pass
#不帶參數的裝飾器
# wraper 將fn進行裝飾,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

裝飾器修飾帶參數的函數:    
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

裝飾器修飾不確定參數個數的函數:    
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

帶參數的裝飾器,再包一層就可以了:    
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.(這是靜態方法)")
  @staticmethod
  def release():
    print("locker.release() called.(不需要對象實例")
def deco(cls):
  '''cls 必須實現acquire和release靜態方法'''
  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.(這是靜態方法)
 myfunc() called.
locker.release() called.(不需要對象實例
>>>     
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 必須實現acquire和release靜態方法'''
  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程序設計有所幫助。

數據分析咨詢請掃描二維碼

若不方便掃碼,搜微信號:CDAshujufenxi

數據分析師資訊
更多

OK
客服在線
立即咨詢
日韩人妻系列无码专区视频,先锋高清无码,无码免费视欧非,国精产品一区一区三区无码
客服在線
立即咨詢