python裝飾器

python中最不想python風格的就是裝飾器了,特別是‘@’很令新來python的人費解,不過裝飾器可是很強大的功能。
裝飾器語法有兩種,類風格和函數風格
類風格例子:
class entryExit(object):

def __init__(self, f):
self.f = f

def __call__(self):
print "Entering", self.f.__name__
self.f()
print "Exited", self.f.__name__

@entryExit
def func1():
print "inside func1()"

@entryExit
def func2():
print "inside func2()"

func1()
func2()

輸出結果是
Entering func1
inside func1()
Exited func1
Entering func2
inside func2()
Exited func2

類裝飾的設計需要連個方法,包含參數爲裝飾函數的初始化函數和代替執行函數的__call__函數,當該python文件被編譯時,先執行初始化方法,當被裝飾的函數被執行的時候執行__call__方法中的內容,自己本身的執行內容也被__call__方法替代,因此把裝飾函數提前在初始化方法中爲__call__準備好使用。
函數風格代碼比較簡單:
def entryExit(f):
def new_f():
print "Entering", f.__name__
f()
print "Exited", f.__name__
return new_f

@entryExit
def func1():
print "inside func1()"

@entryExit
def func2():
print "inside func2()"

func1()
func2()
print func1.__name__

結果同上,其中的new_f是python語法中的閉包,打印函數名稱時打印了'new_f',如果想打印當前調用的函數,則可修改爲
def entryExit(f):
def new_f():
print "Entering", f.__name__
f()
print "Exited", f.__name__
new_f.__name__ = f.__name__
return new_f
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章