python函式裡面的裝飾器和閉包的理解

2021-07-10 16:19:32 字數 1065 閱讀 8153

最近看了看《python核心程式設計》感覺裡面函式裡面的一些高階主題中的函式的裝飾器和閉包很有意思,所以特此記錄下來,以後忘記的話可以回顧一下。

裝飾器實際上是一類函式,它接受函式物件作為傳入引數,返回的結果也是乙個函式。這樣就可以為傳入的函式增加一些特性,比如:引入日誌、增加計時邏輯來檢測效能、給函式加入事務能力等。裝飾器的語法以@開頭,接著是裝飾器函式的名字和可選引數,下一行開頭就跟著被裝飾的函式,如下所示:

@decorator(args_of_decorator) #裝飾器

def fun(args_of_decorator): #被裝飾的函式

... #具體實現內容

下面實際舉乙個例子:
#coding=utf-8

from time import ctime,sleep

#下面是乙個典型的裝飾器函式,可以輸出被裝飾函式被呼叫的時間和被裝飾函式的名字

def df(func):

def wf():

print '%s %s() called' % (ctime(),func.__name__);

return func();

return wf;

#下面用裝飾器裝飾乙個普通函式

@dfdef f():

pass;

#到這一步時,函式f()=df(f())=wf(),因此下面兩次迴圈實際上執行了兩次裝飾器內部的wf函式

for i in range(2):

sleep(1)

f();

執行結果為:
tue mar 22 21:37:35 2016 f() called

tue mar 22 21:37:36 2016 f() called

閉包實際上就是指乙個內部函式裡面,對在外部作用域(但不是全域性作用域)的變數進行引用,那麼內部函式就被認為是閉包。比如上面的例子裡面的的裝飾器函式df()在定義時,裡面又定義了乙個內部函式wf(),在wf()裡面使用了func這個變數(這個變數在wf()函式的外部作用域,但又不在全域性作用域),這裡的函式wf()就是乙個閉包。

python裡面的functools函式

在使用之前要先導入functools庫,偏函式是在一次呼叫之後再次呼叫時相應的引數就不用再傳了。如上圖所示 在第一次呼叫偏函式之後之前傳進去的值1,2,3一直在函式裡面。如果乙個函式 def note func note function def print note something retur...

python裝飾器 函式裝飾器,類裝飾器

只要實現此 模式,這個obj就叫乙個裝飾器 參考 函式裝飾器 例子 def decorator func def inner args,kwargs print before.res func args,kwargs print after.return res return inner decor...

python 裝飾器 函式裝飾器 類裝飾器

python函式裝飾器和類裝飾器筆記.usr bin env python coding utf 8 author ivan file decorators.py version from functools import wraps 裝飾器 目的是為了給函式新增附加功能 1.不帶引數裝飾器 此方式...