python裝飾器學習

2021-09-12 14:53:09 字數 2323 閱讀 2953

(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...