(1)裝飾器的本質:閉包函式
(2)裝飾器的作用:在不改變原函式的呼叫方式情況下,給原函式增加其他功能。
(3)開發原則:開放封閉原則。
(4)語法:@+裝飾器函式名
閉包函式:巢狀函式,內部函式呼叫外部函式的變數。
def outer(arg1):
def inner():
print(arg1)
return inner
if __name__=="__main__":
func=outer(1)
func()
開放封閉原則:①對功能擴充套件是開放的②對原函式的呼叫方法是封閉的,即對修改是封閉的。
(1)裝飾不帶引數的函式
import time
def timer(func):
def inner():
start=time.time()
func()
end=time.time()
print(end-start)
return inner
@timer
def func():
time.sleep(3)
if __name__=="__main__":
func()
(2)裝飾帶引數的函式。
def adder(func):
def inner(*args,**kwargs):
func(*args,**kwargs)
print("兩數之和:",args[0]+args[1])
return inner
@adder
def func(arg1,arg2):
print("兩數之差:",arg1-arg2)
if __name__=="__main__":
func(2, 1)
(3)帶引數的裝飾器
import time
flag=true
def outer(flag):
def timer(func):
def inner():
if flag:
start=time.time()
func()
end=time.time()
print(end-start)
else:
func()
return inner
return timer
@outer(flag)
def func():
time.sleep(3)
print("123")
if __name__=="__main__":
func()
(4)多個裝飾器裝飾乙個函式
import time
def timer(func):
def inner(*args, **kwargs):
start=time.time()
func(*args, **kwargs)
end=time.time()
print(end-start)
return inner
def adder(func):
def inner(*args, **kwargs):
func(*args, **kwargs)
print("兩數之和:", args[0] + args[1])
return inner
@timer
@adder
def func(arg1, arg2):
time.sleep(2)
print("兩數之差:", arg1 - arg2)
if __name__ == "__main__":
func(2, 1)
(5) 特殊裝飾器(wraps)
from functools import wraps
import time
def timer(func):
@wraps(func)
def inner():
start=time.time()
func()
end=time.time()
print(end-start)
return inner
@timer
def func():
time.sleep(3)
if __name__=="__main__":
func()
python學習 裝飾器
def w1 func def inner print 正在驗證 func 閉包 return inner def f1 print f1 def f2 print f2 f1 w1 f1 呼叫的 f1 發生改變 f1 在沒有修改 f1 引用的前提下,完成對 f1 的擴充套件 執行結果 在很多情況下...
python學習(裝飾器)
裝飾器就是閉包的具體使用,可以不改變原來的函式 對其功能進行擴充。import time def outer func def inner num t1 time.time func num t2 time.time print 時間為 t2 t1 return inner outer def fu...
Python學習 裝飾器
裝飾器作為乙個函式,可以為其他函式在不修改原函式 的前提下新增新的功能 裝飾器的返回值是乙個函式物件。它經常用於有切面需求的場景,比如 插入日誌 效能測試 事務處理 快取 許可權校驗等。裝飾器,可以讓我們抽離出大量與函式功能本身無關的相同 並在裝飾器函式中使用 一 作用域 二 高階函式 三 閉包 l...