開發者學堂課程【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 這個函數進行擴充,這樣對原來的加法程式沒有改變,但這樣有一個很嚴重的問題,就是隻能對一個函數擴充,不能通用于任何函數