天天看點

裝飾器引入|學習筆記

開發者學堂課程【Python 語言基礎 3:函數、面向對象、異常處理:裝飾器引入】學習筆記,與課程緊密聯系,讓使用者快速學習知識。

課程位址:

https://developer.aliyun.com/learning/course/601/detail/8738

裝飾器引入

目錄

一、建立幾個函數

二、範例 1

三、範例 2

建立幾個函數:

def add(a,b):

求任意兩個數的和

return a+b

def mul(a,b):

求任意兩個數的積

 …

return a*b

r=add(123,456)

print(r)

此時結果就出來了,算出了答案為 579

若将其改為 ​

r=mul(123,456)

​則算出了一個乘積,結果為 56088

這就是一個求和的函數和一個求積的函數。

現在希望函數可以在計算前,列印開始計算,計算結束後列印計算完畢

如:​

def add(a,b):

求任意兩個數的和

print('

​​

計算開始…'

)

return a+b

print('

計算結束…'

)

return r

這樣最終把結果傳回,這樣我們一儲存,再來個​

r=add(123,456)

print(r)

​ 這樣便會出現一個計算開始和一個計算結束,這個時候,便是我們列印的結果。

我們可以直接通過修改函數中的代碼來完成這個需求,但是會産生以下一些問題:

①如果要修改的函數過多,修改起來會比較麻煩

②并且不友善後期的維護

③并且這樣做會違反開閉原則(OCP)

程式的設計要求開發對程式的擴充,要關閉對程式的修改

即為對一個函數的要求不滿足,可以對其進行擴充,增強一下其功能,對它進行更新,但如果是直接對它進行修改,這是不允許的,這就是開閉原則。

我們希望在不修改原函數的情況下來對函數進行擴充

def fn()

print(我是fn函數…)

這時候我們希望對它進行擴充,我們希望在這個函數執行前,列印一個函數執行,這個時候我們要對它在不修改的情況下進行擴充,隻需要做一件事,我們隻需要根據我們現有的函數來建構一個新的函數

舉例1:

def fn2()

print('函數開始執行~~~')

fn()

print

('函數執行結束~~~')

fn2()

這樣就達到了對函數 fn() 的擴充,此時 fn2() 就等于代替了 fn(),并且沒有修改原來的函數

舉例2:

def new_add():

print('函數開始執行~~~')

add()

print('函數執行結束~~~')

若直接建構新函數 new_add(),add 為丢失兩個必要的參數 a 和 b,因為 add 需要定義兩個參數,而在 new_add() 裡面沒有兩個參數,此時換成​

new_add(123,456)

​就可以了

結果需要有一個傳回值去接收

既然你的結果在這兒,那我直接來個r等量,我們用一個變量去接收,在函數執行完畢後,我們 return r 一下,我們再把那個結果傳回就不會了,這個時候再去執行,這個時候就有結果了。我們再來另外一個例子

def new_add(a,b):

print('

計算開始

~~~')

r

add(a,b)

print('

計算

結束~~~')

return r

r

=new add(123,456)

print(r)

這樣一執行便會有一個結果 579

若換成​

r=new add(111,222)

​則結果為 333

通過這種方法就是對 add 這個函數進行擴充,這樣對原來的加法程式沒有改變,但這樣有一個很嚴重的問題,就是隻能對一個函數擴充,不能通用于任何函數