器-》工具
裝飾-》新增新功能
裝飾器就是定義乙個函式,用該函式去為其他函式新增新功能
開放封閉原則:針對上線的功能對拓展是開放的,但是對修改源**以及呼叫方式是封閉的
裝飾器就是在遵循開放封閉原則的前提下為被裝飾物件新增新功能
1、不修改被裝飾物件的源**
1、不修改被裝飾物件的呼叫方式
# 需求:為index加上新功能-》統計其執行時間
# import time
## def index():
# time.sleep(1)
# print('from index')
## index()
# 方案1:
import time
defindex()
: start=time.time(
) time.sleep(1)
print
('from index'
) stop=time.time(
)print
('run time is %s'
%(stop - start)
)index(
)# 方案2:
import time
defindex()
: time.sleep(1)
print
('from index'
)start=time.time(
)index(
)stop=time.time(
)print
('run time is %s'
%(stop - start)
)# 方案3:
import time
defindex()
: time.sleep(1)
print
('from index'
)def()
: start=time.time(
) index(
) stop=time.time(
)print
('run time is %s'
%(stop - start)))
# 方案3.1
import time
defindex()
: time.sleep(1)
print
('from index'
)def
(f):
start=time.time(
) f(
)# 函式index的記憶體位址()
stop=time.time(
)print
('run time is %s'
%(stop - start)
)# 方案3.2
import time
defindex()
: time.sleep(1)
print
('from index'
)def
outter
(f):
# f=函式index的記憶體位址
def():
start=time.time(
) f(
)# 函式index的記憶體位址()
stop=time.time(
)print
('run time is %s'
%(stop - start)
)index=outter(index)
# outter(函式index的記憶體位址)
index(
)# 改進1
import time
defindex()
: time.sleep(1)
print
('from index'
)def
home
(name)
: time.sleep(2)
print
('home page,welecome %s'
%name)
defoutter
(f):
# f=函式home的記憶體位址
def(name)
: start=time.time(
) f(name)
# 函式home的記憶體位址(name)
stop=time.time(
)print
('run time is %s'
%(stop - start)
)# index=outter(index) # outter(函式index的記憶體位址)
# index()
home=outter(home)
# outter(函式home的記憶體位址)
home(
"egon"
)# 改進2
import time
defindex()
: time.sleep(1)
print
('from index'
)def
home
(name)
: time.sleep(2)
print
('home page,welecome %s'
%name)
defoutter
(f):
# f=函式home的記憶體位址
def(
*args,
**kwargs)
: start=time.time(
) f(
*args,
**kwargs)
# 函式home的記憶體位址(name)
stop=time.time(
)print
('run time is %s'
%(stop - start)
)# index=outter(index) # outter(函式index的記憶體位址)
# index()
# home=outter(home) # outter(函式home的記憶體位址)
# home("egon")
# 改進3 (終極改進)
import time
defindex()
: time.sleep(1)
print
('from index'
)def
home
(name)
: time.sleep(2)
print
('home page,welecome %s'
% name)
return
123def
outter
(f):
# f=函式home的記憶體位址
def(
*args,
**kwargs)
: start = time.time(
) res = f(
*args,
**kwargs)
# 函式home的記憶體位址(name)
stop = time.time(
)print
('run time is %s'
%(stop - start)
)return res
index = outter(index)
home = outter(home)
res = index(
)print
(res)
# none
res = home(
"egon"
)print
(res)
# 123
python基礎之裝飾器
裝飾器的本質是乙個閉合函式,該閉合函式的自由變數是乙個函式,可以使 的重要性與擴充套件性大大加強。通過 後新增裝飾器函式 def checkparams fn 只接受字串的裝飾器 if isinstance strname,str 判斷是否是字串型別 return fn strname 如果是則呼叫...
Python基礎之裝飾器
器即函式 裝飾即修飾,意指為其他函式新增新功能。裝飾器定義 本質就是函式,功能是為其他函式新增新功能。1.不修改被裝飾函式的源 開放封閉原則 2.為被裝飾函式新增新功能後,不修改被修飾函式的呼叫方式。不用傳引數來使用裝飾器。以下的操作是為函式foo來增加新的計時功能 不改變原函式的 和呼叫方式 im...
python基礎之裝飾器
裝飾器 本質就是函式,功能是為其他函式新增附加功能 原則 1.不修改被修飾函式的源 2.不修改被修飾函式的呼叫方式 裝飾器的知識儲備 裝飾器 高階函式 函式巢狀 閉包 高階函式 1.函式接收的引數是乙個函式名 2.函式的返回值是乙個函式名 3.滿足上述條件任意乙個,都可稱之為高階函式 以下 實現了為...