Python 裝飾器

# -*- coding:utf-8 -*-
# 增強now()函數的功能,比如,在函數調用前後自動打印日誌,但又不希望修改now()函數的定義,
# 這種在代碼運行期間動態增加功能的方式,稱之爲“裝飾器”(Decorator)。
# 本質上,decorator就是一個返回函數的高階函數,
# 裝飾器的主要功能在於不改變原有函數極其調用的基礎上擴展函數功能。
import time
import functools


def metric(fn):
   @functools.wraps(fn)
   def wrapper(*args, **kw):
      start = time.time()
      print('%s exectued in %s ms' % (fn.__name__, 1000*(time.time() - start)))
      return fn(*args, **kw)
   return wrapper


@metric
def fast(x, y):
   time.sleep(0.0012)
   return x + y


@metric
def slow(x, y, z):
   time.sleep(0.1234)
   return x * y * z


f = fast(11, 22)
s = slow(11, 22, 33)
print(f)
print(s)
if f != 33:
   print('測試失敗!')
elif s != 7986:
   print('測試失敗!')


def log(text=''):  
   def test_log(func):
      @functools.wraps(func)
      def inner(*args, **kw):
         print('%s begin call: %s' % (text, func.__name__))
         c = func(*args, **kw)
         print('%s end call %s ' % (text, func.__name__))
         return c
      return inner
   return test_log


@log()  # 此處如果沒有()將無法執行
def f():
   pass


@log('execute')
def d():
   pass


f()
d()
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章