@符號在python語言中具有特殊含義,用來作為修飾符使用。
具體可以參考下面的代碼:
#! /usr/bin/env python
#coding=utf-8
from time import ctime, sleep
def tcfunc(func):
def wrappedFunc():
print '[%s] %s() called' %(
ctime(), func)
return func()
print "in tcfunc called"
print "wrapped func %s" %wrappedFunc
return wrappedFunc
# decorator 僅調用tcfunc函數,該函數將foo作為一個參數,返回一個
# wrappedFunc函數對象,用該對象來取代foo函數在外部的調用,foo
# 定義的函數只能夠在內部進行調用,外部無法擷取其調用方式!!
@tcfunc # call sequence is : tcfunc(func) --> wrappedFunc -- > func
def foo():
print "in foo called"
pass
print "foo func : %s" %foo
foo()
print "-"*100
sleep(4)
for i in range(2):
sleep(i)
foo()
print "-"*100
上面函數中,tcfunc定義了一個函數,裡面內嵌一個函數,該函數需要一個func的參數。
@tcfunc則表示下面定義的函數將函數名作為tcfunc的參數被tcfunc調用。
代碼:@tcfunc
def foo():
pass
在定義的時候,就被tcfunc調用,即tcfunc(foo),該函數返回一個wrappedFunc對象,而該定義foo函數名對象其實已經被wrappedFunc對象給取代, foo()定義的函數只在tcfunc函數內部作為參數被使用!我們可以通過列印它們的地址來查看tcfunc外部調用的foo與wrappedFunc是否為同一個對象:
in tcfunc called
wrapped func <function wrappedFunc at 0x01A3DD30>
foo func : <function wrappedFunc at 0x01A3DD30>
[Thu Jan 08 00:04:35 2009] <function foo at 0x01A3DCF0>() called
in foo called
----------------------------------------------------------------------------------------------------
[Thu Jan 08 00:04:39 2009] <function foo at 0x01A3DCF0>() called
in foo called
----------------------------------------------------------------------------------------------------
[Thu Jan 08 00:04:40 2009] <function foo at 0x01A3DCF0>() called
in foo called
----------------------------------------------------------------------------------------------------
從中可以看到,在tcfunc外部的函數對象與wrappedFunc的函數對象是同一個對象,在tcfunc內部參數func中調用的
才是實際定義的foo函數對象!!!