為已存在的函式或物件新增額外的功能
裝飾器 = 高階函式 + 巢狀函式
函式名作為引數傳遞給裝飾器(@decorator_name)
裝飾函式返回函式名(函式位址)
預設情況下,裝飾器會修改名字和文件說明,但是可以使用functools
中 的@wraps()
解決。@wraps接受乙個函式來進行裝飾,並加入了複製函式名稱、注釋文件、引數列表等等的功能。這可以讓我們在裝飾器裡面訪問在裝飾之前的函式的屬性。
裝飾器作用於函式上,但是如果裝飾器裝飾在乙個類上面,相當於為類中的所有方法都加上了裝飾器
def decorator(func):
"""decorator __doc__
"""# @wraps(func)
func()
@decorator
def test():
"""test __doc__"""
time.sleep(0.5)
test(1, 2)
print("function name:", test.__name__)
print("function doc :", test.__doc__)
# output:
# 加了@wraps(func)後的output:
# function name: test
# function doc : test __doc__
此例子實現了乙個計算呼叫函式所占用的時間
import time
from functools import wraps
def decorator(func):
"""function:decorator
"""@wraps(func)
start = time.time()
ret = func(*args, **kwargs)
end = time.time()
print("function run time: ".format(func.__name__, end - start))
# print("function run time: ".format(fun=func.__name__, time=end - start))
return ret
@decorator
def test(a, b, name="lizo"):
"""function:test"""
time.sleep(0.5)
print(a, b, name)
為什麼可以使用類作為裝飾器?因為在python中,一切皆物件,其實函式也是乙個物件,如果乙個類實現了 __call__(self)
方法後,就可以像呼叫函式一樣,直接加乙個括號就可以呼叫。
class runtime:
def __init__(self):
pass
def __call__(self, func):
@wraps(func)
start = time.time()
ret = func(*args, **kwargs)
end = time.time()
print("function: run time: ".format(func=func.__name__, time=end - start))
return ret
#使用裝飾器方法1
runtime = runtime()
@runtime
def test_class_decorator1():
print("in the test_class_decorator")
time.sleep(0.2)
#使用裝飾器方法2
@runtime()
def test_class_decorator2():
print("in the test_class_decorator")
time.sleep(0.2)
class runtime:
def __init__(self, func):
self.func = func
def __call__(self, *args, **kwargs):
# @wraps(self.func)
start = time.time()
ret = self.func(*args, **kwargs)
end = time.time()
print("function: run time: ".format(func=self.func.__name__, time=end - start))
return ret
@runtime
def test_class_decorator1():
print("in the test_class_decorator")
time.sleep(0.2)
如果需要裝飾器接收引數,則需要新增一層函式
import time
from functools import wraps
def decorator(a):
def inner(func):
@wraps(func)
start = time.time()
ret = func(*args, **kwargs)
end = time.time()
print("function run time: ".format(func.__name__, end - start))
return ret
return inner
@decorator(a=1)
def test(a, b, name="lizo"):
pass
python裝飾器介紹 Python之裝飾器簡介
python函式式程式設計之裝飾器 1.開放封閉原則 簡單來說,就是對擴充套件開放,對修改封閉。在物件導向的程式設計方式中,經常會定義各種函式。乙個函式的使用分為定義階段和使用階段,乙個函式定義完成以後,可能會在很多位置被呼叫。這意味著如果函式的定義階段 被修改,受到影響的地方就會有很多,此時很容易...
python 找到裝飾器 Python之裝飾器
裝飾器本質上就是乙個python函式,他可以讓其他函式在不需要做任何 變動的前提下,增加額外的功能,裝飾器的返回值也是乙個函式物件。裝飾器的作用 在不改變原函式及原函式的執行的情況下,為原函式增加一些額外的功能,比如列印日誌 執行時間,登入認證等等。乙個簡單的裝飾器 import time def ...
Python之裝飾器
裝飾器就是乙個以函式作為引數並返回乙個替換函式的可執行函式 即裝飾器是乙個函式,其引數為函式,返回值也為函式 可理解為對函式的功能進行拓展,所以叫裝飾 outer為裝飾器,效果為給被裝飾函式返回值結果加負號 defouter fun definner x return fun x return in...