Python裝飾器的使用

2021-10-11 20:20:09 字數 1489 閱讀 3098

本文介紹的是python裝飾器

的使用,分三部分記錄裝飾器,旨在為之後複習保留學習筆記。python裝飾器在沒有改變原始函式呼叫方式的同時,在原始函式的前後增加功能,滿足開放封閉原則。

目錄

1. 裝飾器的固定模板

2.帶引數的裝飾器模板

3.多個裝飾器函式裝飾乙個函式

# 裝飾器的固定模板

def inner(*args, **kwargs):

ret = f(*args, **kwargs)

return ret

return inner

def f():

pass

f()

import time

def timer(f):

def inner(*args, **kwargs):

start = time.time()

ret = f(*args, **kwargs)

end = time.time()

print(end - start)

return ret

return inner

@timer

def func(a):

time.sleep(0.01)

return '新年好'

# func = timer(func)

ret = func(1)

print(ret)

func函式是乙個有引數且有返回值的普適函式,timer是裝飾器函式,在內部f函式呼叫前後增加時間記錄功能,並列印執行時間。

注釋部分:# func = timer(func)等同於@timer操作,timer(func)函式執行後返回inner函式位址,此時的func=inner,之後ret=func(1)等同於ret=inner(1)

def inner(*args, **kwargs):

ret = func(*args, **kwargs)

return ret

return inner

def f():

pass

f()

def inner1(*args, **kwargs):

ret = func(*args, **kwargs)

return ret

return inner1

def inner2(*args, **kwargs):

ret = func(*args, **kwargs)

return ret

return inner2

def f():

print("in f")

f() # inner2()

in f

現象是:外層的裝飾器先執行,然後內層的裝飾器再執行,然後遞迴推出函式呼叫

參考文獻:

python 裝飾器的使用

使用裝飾器將函式作為引數,最後再返回乙個引數,簡單來說就是在不修改原函式的 上對原函式新增新的功能。1 在原函式中新增乙個裝飾器 原函式 def sayhello print hello,world sayhello 新增裝飾器後 import functools def decorator fun...

python裝飾器的使用

在class內部,可以有屬性和方法,而外部 可以通過直接呼叫例項變數的方法來運算元據,這樣,就隱藏了內部的複雜邏輯。但是,從前面student類的定義來看,外部 還是可以自由地修改乙個例項的name score屬性 如果要讓內部屬性不被外部訪問,可以把屬性的名稱前加上兩個下劃線 在python中,例...

python裝飾器的使用

它可以使我們的 看起來更簡潔,可以修改部分函式功能,讓你的 看起來很 高階 當然,它也可能會造成 的閱讀性變差,所以在使用裝飾器的時候,你需要做乙個取捨。首先來看一段 def param func return hi,im a function def decoration function pri...