python 装饰函数
生活随笔
收集整理的這篇文章主要介紹了
python 装饰函数
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
裝飾器的作用 —— 不想修改函數的調用方式 但是還想在原來的函數前后添加功能 原則: 開放封閉原則
開放 : 對擴展是開放的
封閉 : 對修改是封閉的
# timmer就是一個裝飾器函數,只是對一個函數 有一些裝飾作用 1 import time 2 def timmer(f): #裝飾器函數 3 def inner(): 4 start = time.time() 5 f() #被裝飾的函數 6 end = time.time() 7 print(end - start) 8 return inner 9 10 @timmer #語法糖 @裝飾器函數名 11 def func(): #被裝飾的函數 12 time.sleep(0.01) 13 print('老板好同事好大家好') 14 return '新年好' 15 #inner 16 #func = timmer(func) 17 ret = func() #inner() 18 print(ret) 裝飾帶參數函數的裝飾器 def timmer(f): #裝飾器函數def inner(*args,**kwargs):#(1,2) /(1)start = time.time()ret = f(*args,**kwargs) #f(1,2) #被裝飾的函數end = time.time()print(end - start)return retreturn inner@timmer #語法糖 @裝飾器函數名 def func(a,b): #被裝飾的函數time.sleep(0.01)print('老板好同事好大家好',a,b)return '新年好' 裝飾器的固定模式
def wrapper(f): #裝飾器函數,f是被裝飾的函數def inner(*args,**kwargs):'''在被裝飾函數之前要做的事'''ret = f(*args,**kwargs) #被裝飾的函數'''在被裝飾函數之后要做的事'''return retreturn inner@wrapper #語法糖 @裝飾器函數名 def func(a,b): #被裝飾的函數time.sleep(0.01)print('老板好同事好大家好',a,b)return '新年好' 裝飾器進階?
帶參數的裝飾器
#500個函數統一
import time FLAG=False def time_out(FLAGE):def timmer(f): #裝飾器函數def inner(*args,**kwargs):#(1,2) /(1)if FLAGE:start = time.time()ret = f(*args,**kwargs) #f(1,2) #被裝飾的函數end = time.time()print(end - start)return retelse:ret = f(*args, **kwargs) # f(1,2)return retreturn innerreturn timmer@time_out(FLAG) #語法糖 @裝飾器函數名 def func(a,b): #被裝飾的函數time.sleep(0.01)print('老板好同事好大家好',a,b)return '新年好'func(2,3)
開放 : 對擴展是開放的
封閉 : 對修改是封閉的
# timmer就是一個裝飾器函數,只是對一個函數 有一些裝飾作用 1 import time 2 def timmer(f): #裝飾器函數 3 def inner(): 4 start = time.time() 5 f() #被裝飾的函數 6 end = time.time() 7 print(end - start) 8 return inner 9 10 @timmer #語法糖 @裝飾器函數名 11 def func(): #被裝飾的函數 12 time.sleep(0.01) 13 print('老板好同事好大家好') 14 return '新年好' 15 #inner 16 #func = timmer(func) 17 ret = func() #inner() 18 print(ret) 裝飾帶參數函數的裝飾器 def timmer(f): #裝飾器函數def inner(*args,**kwargs):#(1,2) /(1)start = time.time()ret = f(*args,**kwargs) #f(1,2) #被裝飾的函數end = time.time()print(end - start)return retreturn inner@timmer #語法糖 @裝飾器函數名 def func(a,b): #被裝飾的函數time.sleep(0.01)print('老板好同事好大家好',a,b)return '新年好' 裝飾器的固定模式
def wrapper(f): #裝飾器函數,f是被裝飾的函數def inner(*args,**kwargs):'''在被裝飾函數之前要做的事'''ret = f(*args,**kwargs) #被裝飾的函數'''在被裝飾函數之后要做的事'''return retreturn inner@wrapper #語法糖 @裝飾器函數名 def func(a,b): #被裝飾的函數time.sleep(0.01)print('老板好同事好大家好',a,b)return '新年好' 裝飾器進階?
帶參數的裝飾器
#500個函數統一
import time FLAG=False def time_out(FLAGE):def timmer(f): #裝飾器函數def inner(*args,**kwargs):#(1,2) /(1)if FLAGE:start = time.time()ret = f(*args,**kwargs) #f(1,2) #被裝飾的函數end = time.time()print(end - start)return retelse:ret = f(*args, **kwargs) # f(1,2)return retreturn innerreturn timmer@time_out(FLAG) #語法糖 @裝飾器函數名 def func(a,b): #被裝飾的函數time.sleep(0.01)print('老板好同事好大家好',a,b)return '新年好'func(2,3)
多個裝飾器裝飾一個函數
#多個裝飾器裝飾一個函數 def wrapper1(func):def inner1():print('wrapper1 ,before func')ret = func()print('wrapper1 ,after func')return retreturn inner1 def wrapper2(func):def inner2():print('wrapper2 ,before func')ret = func()print('wrapper2 ,after func')return retreturn inner2 def wrapper3(func):def inner3():print('wrapper3 ,before func')ret = func()print('wrapper3 ,after func')return retreturn inner3@wrapper3 @wrapper2 @wrapper1 def f():print('in f')return '哈哈哈'print(f()) ### wrapper3 ,before func wrapper2 ,before func wrapper1 ,before func in f wrapper1 ,after func wrapper2 ,after func wrapper3 ,after func 哈哈哈
wraps的用法
from functools import wraps def wrapper(func): #func = holiday@wraps(func)def inner(*args,**kwargs):print('在被裝飾的函數執行之前做的事')ret = func(*args,**kwargs)print('在被裝飾的函數執行之后做的事')return retreturn inner@wrapper #holiday = wrapper(holiday) def holiday(day):'''這是一個放假通知'''print('全體放假%s天'%day)return '好開心'print(holiday.__name__) print(holiday.__doc__) ret = holiday(3) #inner print(ret)? ?
轉載于:https://www.cnblogs.com/olivia2018/p/8137505.html
總結
以上是生活随笔為你收集整理的python 装饰函数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 更换checkbox的原有样式
- 下一篇: python3----运算符