首先理解python的函式能像普通的物件一樣能作為引數傳遞給其他函式,可以被賦值給其他變數,可以作為返回值,可以被定義在另外乙個函式內。
前面的文章已經對閉包做了介紹,再次進行延伸和理解一下裝飾器,主要用於不在改變源**的情況下進行新增功能,裝飾器利用閉包來實現,一般和閉包一起使用。
裝飾器返回乙個函式物件,簡單理解在原函式功能上又加入新功能並返回乙個和原函式名相同的函式物件。
def funcout(func):
def funcin(x,y):
func(x,y)#外部函式傳入的引數test函式在內部函式的呼叫
addf()#新增功能函式
return funcin
#閉包 外部無法直接訪問內部函式 將乙個函式當成引數傳遞進來 funcout(test)呼叫時返回乙個函式物件 用乙個變數接收函式物件的位址比如假設為ss
#ss(1,2) 呼叫的內部函式 func是傳進來的函式test 此時func呼叫傳入的函式 test需要兩個引數 需要在內部函式中傳參
def addf():
print("新增功能")
def test(a,b):
print("a=%s,b=%s"%(a,b))
ff =funcout(test)
ff(1,2)#呼叫函式
在上面**將函式test 進行替換成下列呼叫方式 就是加了乙個@符號 實現裝飾器寫法更簡單
@funcout # 裝飾器 相當於 test=func(test)
def test(a,b):
print("a=%s,b=%s"%(a,b))
test(1,2)#呼叫函式test 為裝飾器的函式 增加新的功能之後的test
通用裝飾器函式 對可變引數的處理def funcout(func):
def funcin(*args,**kwargs)
func(*args,**kwargs) #沒有返回值時使用
addf()
return funcin(*args,**kwargs) #內部函式的返回值 防止傳入的函式有返回值 有返回值時使用
return funcin
還可以定義多個裝飾器 執行順序是從裡到外的。
@a@b
@cdef f ():
等效於 f = a(b(c(f)))
python初步認識
string hello shiyanlou string 0 獲取第乙個字元 h string 1 獲取第二個字元 e string 2 l string 1 獲取倒數第乙個字元 u string 2 獲取倒數第二個字元 o 9.format 是專門用來 格式化字串 的函式,它最常用的功能就是 插...
Python裝飾器的初步使用
所謂裝飾器其實就是把函式名作為引數傳遞給另乙個引數,使得每次呼叫這個被裝飾函式的時候都可以在呼叫前做點什麼,或者在呼叫後做點什麼,甚至可以不呼叫被裝飾函式,因為被裝飾函式的呼叫都是在裝飾函式裡,如果在裝飾函式裡不呼叫。def dec func print this is dec def wrap a...
python的初步認識
python在自動化運維方面越做越多,只掌握shell似乎落伍了,在學習python之前先溫習一下什麼是面向過程和物件導向。面向過程 以指令為中心,由指令處理資料。組織 解決問題 物件導向 以資料為中心,所有處理 都圍繞資料展開。設計資料結構 bash是面向過程的,python支援物件導向和物件導向...