不用裝飾器會代碼冗餘c#
# import time # def cen1(): # time.sleep(2) # print("你好1") # def cen2(): # print("你好2") # def cen3(): # print("你好3") # time_start=time.time() # cen1() # print(time.time()-time_start) # # time_start=time.time() # cen2() # print(time.time()-time_start)
不太完美的裝飾器函數
# import time # def cen1(): # time.sleep(2) # print("你好1") # def cen2(): # print("你好2") # def cen3(): # print("你好3") # # def func(): # def foo(f): # time_start=time.time() # f() # print(time.time()-time_start) # return foo # f=cen1 # cen1=func() # cen1(f)
初版裝飾器code
# import time # def cen1(): # time.sleep(2) # print("你好1") # def cen2(): # print("你好2") # def cen3(): # print("你好3") # # def func(f): # def foo(): # time_start=time.time() # f() # print(time.time()-time_start) # return foo # cen1=func(cen1) # cen1()
語法糖開發
# import time # def func(f): # def foo(): # time_start=time.time() # f() # print(time.time()-time_start) # return foo # @func#省略了把被修飾函數的地址傳遞給修飾器和將修飾器內的函數地址返回給被修飾的函數的名 # def cen1(): # time.sleep(2) # print("你好1") # cen1()
這是完美的import
# def func(f): # def foo(*args,**kwargs): # print("修飾前的函數") # ret=f(*args,**kwargs) # print("修飾後的函數") # return ret # return foo # @func # def cen(*args,**kwargs): # print(f"被修飾的函數{args,kwargs}") # return "我是cen函數" # print(cen(1,2,3,a=1))
這是終結規則擴展
# 1.裝飾器 # 開發封閉原則: # 1.對擴展開放 # 2.對修改源代碼及調用方式封閉 # 裝飾器:不修改源代碼及原調用方式的前提下,額外增長新功能 # 語法糖:寫在被裝飾的函數正上方 # def warpper(f): # def inner(*args,**kwargs): # print("被裝飾函數執行前") # ret = f(*args,**kwargs) # print("被裝飾函數執行後") # return ret # return inner # # @warpper # def func(*args,**kwargs): # print(f"被裝飾的{args,kwargs}") # return "我是func函數" # print(func(1,2,3,4,5,6,7,8,a=1)) # def warpper(f): # def inner(*args,**kwargs): # f(*args,**kwargs) # return inner # # @warpper # def func(): # print(111)