其中ftfunc函數是我們自己自定義的一個函數,這個函數是以一個函數作為參數的函數,這也就滿足了作為一個裝飾器的要求,根據上面我們對于裝飾器的等價變換規則,這段代碼
代碼如下:
@ftfunc
def foo():
print 'hello'
可以轉換成以下的代碼:
代碼如下:
def foo():
print 'hello'
foo = ftfunc(foo)
再結合上面原來的代碼我們很快就可以體會到了裝飾器的作用。
但是我在編寫這段代碼的時候,有一個地方打錯了:
這段代碼:
代碼如下:
return func()
return timef
被我寫成了:
代碼如下:
return func
return timef
于是輸出結果就是不一樣,后來終于發現了一個重要的概念:"foo"是函數對象的引用,而"foo()"是函數對象的調用。關于對象引用是python的重要的基礎概念,在python中一切都是對象,同時類型是屬于對象,而不是變量。一切的變量只是對象的引用,相當于讓這個變量指向這個對象?!癴oo”正好可以理解成一個變量,只不過是它指向一個函數的對象。而“foo()”是函數對象的調用,即調用這個對象,是要執行這個函數的功能的。這里需要慢慢理解品味?;诖耍?
這樣的一段代碼運行結果和剛才是一模一樣的。注意比較與剛才那段代碼的不同之處,更加有利于理解。
代碼如下:
# -*- coding: utf-8 -*-
from time import ctime
from time import sleep
def ftfunc(func):
def timef():
print "[%s] %s() called" % (ctime(),func.__name__)
return func
return timef
新聞熱點
疑難解答