一、裝飾器的語法:
@裝飾器
開放封閉原則:軟件實體應(yīng)該是可擴展,而不可修改的。也就是說,對擴展是開放的,而對修改是封閉的。
二、裝飾器的作用:
在不更改原功能函數(shù)內(nèi)部代碼,并且不改變調(diào)用方法的情況下為原代碼添加新的功能。
三、裝飾器的原理:
@decorator 等同于 ===> work1 = decorator(work1)
四、普通裝飾器
def decorator(func):
def wrapper():
print("---開機,打開軟件--")
func()
print("---關(guān)機,底薪到手---")
return wrapper
@decorator# 作用 @decorator 等同于 ===> work1 = decorator(work1)
def work1():
print("----寫代碼---")
work1()
五、裝飾有參數(shù)和返回值的餐宿
5-1:實現(xiàn)傳參
import time
def count_time(func):
def wrapper(a,b):
strat_time = time.time()
func(a,b)
end_time = time.time()
t_time = end_time - strat_time
print('運行總時間:%s' % t_time)
return wrapper
@count_time
def work(a,b):
time.sleep(2)
e = a + b
return e
d = work(2,3)
print(d)

image.png
5-2:實現(xiàn)被裝飾函數(shù)返回值
調(diào)用功能函數(shù),接收功能函數(shù)返回的結(jié)果,裝飾器執(zhí)行完返回結(jié)果
def count_time(func):
def wrapper(a,b):
# 獲取開始時的時間
strat_time = time.time()
result = func(a,b)
end_time = time.time()
t_time = end_time - strat_time
print('運行總時間:%s' % t_time)
return result
return wrapper
@count_time
def work(a,b):
time.sleep(2)
e = a + b
return e
d = work(2,3)
print(d)

image.png
六:裝飾器裝飾類
"""
閉包形式的裝飾器裝飾類:可以在類實例對象的時候,進行功能擴展
"""
"""
閉包形式的裝飾器裝飾類:可以在類實例對象的時候,進行功能擴展
"""
def decorator(item):
def wrapper(*args,**kwargs):
print("裝飾器擴展代碼1")
result = item(*args,**kwargs)
result.name = "木森"
print("裝飾器擴張代碼2")
return result
return wrapper
@decorator #Mytest = decorator(Mytest)
class Mytest:
a = 100
print("Mytest:",Mytest)
print()
print("asb",Mytest())

image.png
七:解決裝飾器副作用--wraps函數(shù)
import time
from functools import wraps
def count_time(fun):
@wraps(fun)
def wrapper(*args,**kwargs):
st = time.time()
# 調(diào)用原功能函數(shù),并使用result接受返回值
result = fun(*args,**kwargs)
et = time.time()
print("函數(shù)執(zhí)行時間:",fun.__name__)
# 裝飾器中的代碼執(zhí)行完后,將原功能函數(shù)的結(jié)構(gòu)返回出去
return result
return wrapper
@count_time
def work(a,b):
"""work函數(shù)"""
res = a+b
time.sleep(2)
return res
@count_time
def work2():
"""work2函數(shù)的文檔注釋"""
for i in range(3):
time.sleep(1)
@count_time
def work3(aa,bb,cc,d,e,f,r,y = 999):
"""work3函數(shù)的注釋"""
print(aa,bb,cc,d,e,f,r,y)
# print(work(1,2))
# print(work2())
# 裝飾器裝飾之后會產(chǎn)生的副作用,無法獲取原功能函數(shù)的特殊屬性
print(work.__name__,work.__doc__)
print(work2.__name__,work2.__doc__)
print(work3.__name__,work3.__doc__)

image.png
八:裝飾器傳參
def decorator(name):
"""最外層的參數(shù),接受裝飾器傳進來的值"""
def wrapper2(func):
"""第二層參數(shù)func,接收被裝飾器的函數(shù)"""
def wrapper3(*args,**kwargs):
"""第三層參數(shù),接受被裝飾的函數(shù),被調(diào)用時傳進來的參數(shù)"""
print("裝飾器擴展的功能代碼1")
res = func(*args,**kwargs)
print("裝飾器擴展的功能代碼2")
return res
return wrapper3
return wrapper2
@decorator("musen")
def work():
return "66666666"
print(work())
