器指的是工具,可以定義成成函式
裝飾指的是為其他事物新增額外的東西點綴
合到一起的解釋:
裝飾器指的定義乙個函式,該函式是用來為其他函式新增額外的功能
開放封閉原則
開放:指的是對拓展功能是開放的
封閉:指的是對修改源**是封閉的
裝飾器就是在不修改被裝飾器物件源**以及呼叫方式的前提下為被裝飾物件新增新功能
需求:在不修改index函式的源**以及呼叫方式的前提下為其新增統計執行時間的功能
def index(x,y):
time.sleep(3)
print('index %s %s' %(x,y))
index(111,222)
# index(y=111,x=222)
# index(111,y=222)
解決方案一:失敗
問題:沒有修改被裝飾物件的呼叫方式,但是修改了其源**
import time
def index(x,y):
start=time.time()
time.sleep(3)
print('index %s %s' %(x,y))
stop = time.time()
print(stop - start)
index(111,222)
解決方案二:失敗
問題:沒有修改被裝飾物件的呼叫方式,也沒有修改了其源**,並且加上了新功能,但是**冗餘
import time
def index(x,y):
time.sleep(3)
print('index %s %s' %(x,y))
start=time.time()
index(111,222)
stop=time.time()
print(stop - start)
解決方案三:失敗
問題:解決了方案二**冗餘問題,但帶來乙個新問題即函式的呼叫方式改變了
import time
def index(x,y):
time.sleep(3)
print('index %s %s' %(x,y))
start=time.time()
index(111,222)
stop=time.time()
print(stop - start)
方案三的優化一:將index的引數寫活了
import time
def index(x,y,z):
time.sleep(3)
print('index %s %s %s' %(x,y,z))
start=time.time()
index(*args,**kwargs) # index(3333,z=5555,y=44444)
stop=time.time()
print(stop - start)
方案三的優化二:在優化一的基礎上把被裝飾物件寫活了,原來只能裝飾index
import time
def index(x,y,z):
time.sleep(3)
print('index %s %s %s' %(x,y,z))
def home(name):
time.sleep(2)
print('welcome %s to home page' %name)
def outter(func): # func = index的記憶體位址
start=time.time()
func(*args,**kwargs) # index的記憶體位址()
stop=time.time()
print(stop - start)
home('egon')
# home(name='egon')
import time
def index(x,y,z):
time.sleep(3)
print('index %s %s %s' %(x,y,z))
def home(name):
time.sleep(2)
print('welcome %s to home page' %name)
def outter(func):
start=time.time()
res=func(*args,**kwargs)
stop=time.time()
print(stop - start)
return res
home=outter(home)
print('返回值-->',res)
大方向:如何在方案三的基礎上不改變函式的呼叫方式
import time
裝飾器def timmer(func):
start=time.time()
res=func(*args,**kwargs)
stop=time.time()
print(stop - start)
return res
# 在被裝飾物件正上方的單獨一行寫@裝飾器名字
# @timmer # index=timmer(index)
def index(x,y,z):
time.sleep(3)
print('index %s %s %s' %(x,y,z))
# @timmer # home=timmer(ome)
def home(name):
time.sleep(2)
print('welcome %s to home page' %name)
index(x=1,y=2,z=3)
home('egon')
疊加多個裝飾器,載入順序與執行順序
def index():
pass
res1=func1(*args,**kwargs)
return res1
res2=func2(*args,**kwargs)
return res2
def deco3(x):
def outter3(func3): # func3=被裝飾物件index函式的記憶體位址
res3=func3(*args,**kwargs)
return res3
return outter3
# 載入順序自下而上(了解)
def index(x,y):
print('from index %s:%s' %(x,y))
def outter(func):
# 1、呼叫原函式
# 2、為其增加新功能
res=func(*args,**kwargs)
return res
index = outeer(index)
python裝飾器詳解(重點)
你會python嘛?我會!那你給我講下python裝飾器吧!python裝飾器啊?我沒用過哎 簡言之,python裝飾器就是用於拓展原來函式功能的一種函式,這個函式的特殊之處在於它的返回值也是乙個函式,使用python裝飾器的好處就是在不用更改原函式的 前提下給函式增加新的功能。一般而言,我們要想拓...
python裝飾器介紹 Python之裝飾器簡介
python函式式程式設計之裝飾器 1.開放封閉原則 簡單來說,就是對擴充套件開放,對修改封閉。在物件導向的程式設計方式中,經常會定義各種函式。乙個函式的使用分為定義階段和使用階段,乙個函式定義完成以後,可能會在很多位置被呼叫。這意味著如果函式的定義階段 被修改,受到影響的地方就會有很多,此時很容易...
python 找到裝飾器 Python之裝飾器
裝飾器本質上就是乙個python函式,他可以讓其他函式在不需要做任何 變動的前提下,增加額外的功能,裝飾器的返回值也是乙個函式物件。裝飾器的作用 在不改變原函式及原函式的執行的情況下,為原函式增加一些額外的功能,比如列印日誌 執行時間,登入認證等等。乙個簡單的裝飾器 import time def ...