Python 中實現裝飾器 @functools.wraps 的做用

廢話不說,先看兩端代碼:app

一、使用了@functools.wraps函數

import time
import functools

def timeit(func):
   @functools.wraps(func)
   def wrapper():
      start = time.clock()
      func()
      end =time.clock()
      print "used:", end - start
   return wrapper

@timeit
def foo():
   print "in foo()"

foo()
print "foo name", foo.__name__

運行結果(foo name 是自身foo):blog

二、未使用@functools.wraps源碼

import time
#import functools

def timeit(func):
   #@functools.wraps(func)
   def wrapper():
      start = time.clock()
      func()
      end =time.clock()
      print "used:", end - start
   return wrapper

@timeit
def foo():
   print "in foo()"

foo()
print "foo name", foo.__name__

運行結果(foo name 是wrapper):it

總結:因而可知,在編寫裝飾器時,在實現前加入@functools.wraps(func) 能夠保證裝飾器不會對被裝飾函數形成影響。import

具體原理,及更詳細的內容還有待看functool源碼去了解。原理

相關文章
相關標籤/搜索