裝飾器是一種特殊的閉包,它是巢狀函式,也呼叫了外部函式的變數,只不是呼叫的是外部函式的形參。
用於裝飾函式
裝飾器的作用 —— 不想修改函式的呼叫方式 但是還想在原來的函式前後新增功能def inner(*args,**kwargs): #引數為被裝飾函式的原始引數timmer就是乙個裝飾器函式,只是對乙個函式 有一些裝飾作用
原則: 開放封閉原則
開放 : 對擴充套件是開放的
封閉 : 對修改是封閉的
裝飾器的固定模式:
'''在被裝飾函式之前要做的事'''
ret = f(*args,**kwargs) #被裝飾的函式,ret是被裝飾函式的返回值
'''在被裝飾函式之後要做的事'''
return ret #返回inner中的值 也就是裝飾後的東西
return inner #返回inner的名字
def func(a,b): #被裝飾的函式
time.sleep(0.01)
return '新年好'
ret = func(1,2) #實際上執行的是inner(1,2) 也就是裝飾後的函式
應用:自定義函式func的執行時間+0.01s
import time裝飾器高階def inner(*args,**kwargs):
start = time.time()
ret = f(*args,**kwargs)
end = time.time()
t = end - start
return ret, t
return inner
def func(a,b='zepei'):
c = 70 + a
return b,c
print(func(2,b='fan')) #(('fan', 72), 0.010000228881835938)
wraps
from functools import wraps帶引數的裝飾器@wraps(func)
def inner(*args,**kwargs):
print('在被裝飾的函式執行之前做的事')
ret = func(*args,**kwargs)
print('在被裝飾的函式執行之後做的事')
return ret
return inner
def holiday(day):
'''這是乙個放假通知'''
print('全體放假%s天'%day)
return '好開心'
print(holiday.__name__) # 加了wraps後 此處列印的是holiday的名字
print(holiday.__doc__) # 列印holiday的解釋文件
ret = holiday(3) #inner
print(ret)
外面再加入乙個巢狀,判斷是否使用裝飾器
import time多個裝飾器裝飾乙個函式flage = false #如果是false 不裝飾函式
def timmer_out(flag):
def timmer(func):
def inner(*args,**kwargs):
if flag:
start = time.time()
ret = func(*args,**kwargs)
end = time.time()
print(end-start)
return ret
else:
ret = func(*args, **kwargs)
return ret
return inner
return timmer
# timmer = timmer_out(flage)
@timmer_out(flage) #wahaha = timmer(wahaha)
def wahaha():
time.sleep(0.1)
print('wahahahahahaha')
@timmer_out(flage)
def erguotou():
time.sleep(0.1)
print('erguotoutoutou')
wahaha()
erguotou()
兩個裝飾器詳解:
三個裝飾器:
def inner1():
ret = func() #func=f
return ret
return inner1
def inner2():
ret = func() #func=inner1
return ret
return inner2
def inner3():
ret = func() #func=inner2
return ret
return inner3
def f():
print('in f')
return '哈哈哈'
f() # inner3()
'''輸出:
in f
'''#如果執行下面的,會列印f的輸出
print(f())
'''輸出:
in f
哈哈哈'''
Python學習之路 day 11 裝飾器
一.裝飾器相關 1.什麼是裝飾器 器 指的是具備某一功能的工具 裝飾 指的是為被裝飾器物件新增新功能 裝飾器就是用來為被裝飾器物件新增新功能的工具 注意 裝飾器本身可以是任意可呼叫物件,被裝飾器的物件也可以是任意可呼叫物件 2.為何要用裝飾器 開放封閉原則 封閉指的是對修改封閉,對擴充套件開放 裝飾...
python學習 day11下午
單例模式,可以用在資料庫,這樣只建立一條管道即可 class a def new cls,args,kwargs if not hasattr a,xiaogou cls.xiaogou object.new cls return cls.xiaogou def init self,name sel...
python 學習筆記 day11 裝飾器
現在有乙個需求,我們想計算一段程式執行的時間,可以採用time模組的time函式 def func print 哈哈哈哈 func 我們可以這樣做 import time deffunc start time.time 函式體內 執行開始的時間 time.sleep 0.02 因為這個程式太簡單,執...