python3 装饰器_python3装饰器
python裝飾器
預備知識
首先我們要知道在python,一切皆對象,函數也是一個對象
>>> def test():
... return "Hello World"
有自己的id值,有type,有自己的值
>>> id(test)
140155005410568
>>> type(test)
>>> test
甚至可以賦值給其他變量
>>> test1 = test
>>> test1()
'Hello World'
哪怕是當做參數傳遞給別的函數,也可以當做函數的返回值
>>> def foo(func):
... print(func)
... return func
...
>>> test2 = foo(test)
>>> test2()
'Hello World'
裝飾器定義
裝飾器本質其實就是一個函數, 可以讓其它函數不改動源代碼的情況下增加其他新功能, 比如網站經常需要的權限校驗等場景
最初的函數
def add(x, y):
print(x+y)
add(1,2)
現在我們有一個新需求, 計算代碼執行時間
import time
def add(x, y):
start_time = time.time
print(x+y)
stop_time = time.time
print("{func} spend {time} ".format(func = "add", time = stop_time-start_time))
add(1,2)
我們當然可以這么寫, 但是一來修改了源代碼可能會造成一些未知的錯誤, 二來如果我們有一百個函數, 這樣寫也不現實, 這就是我們裝飾器出場的時候了.
創建一個裝飾器
import time
def timmer(func):
"""
:param func: 被裝飾的函數
:return: 一個計算函數運行時間的函數
"""
def wrapper(*args, **kwargs):
"""
:param args:收集被裝飾函數的參數
:param kwargs:收集被裝飾函數的關鍵字參數
:return:
"""
start_time = time.time()
# 讓進程睡一秒
time.sleep(1)
# 調用被裝飾的函數
result = func(*args, **kwargs)
stop_time = time.time()
print("{func} spend {time} ".format(func = "add", time = stop_time-start_time))
return result
return wrapper
使用裝飾器
def add(x, y):
print(x,y)
# 因為timmer返回的是wrapper函數對象,所以執行add()相當于執行wrapper()
add = timmer(add)
add(1,2)
如果覺得還是麻煩那就通過一個語法糖@符號來使用裝飾器
@timmer
def add(x, y):
print(x,y)
add(1,2)
這就是最基本的裝飾器, 在不修改源代碼的前提下為函數添加一個新功能, 調用時只需要在原函數上方添加一個 @deco_name , 在這里是@timmer
帶參數的裝飾器
python還允許我們給裝飾器帶上函數
import time
def timmer(flag):
"""
:param flag: 接收裝飾器的參數
:return:
"""
def outer_wrapper(func):
"""
:param func: 接收被裝飾的函數
:return:
"""
# 接收被裝飾函數的參數
def wrapper(*args, **kwargs):
"""
:param args: 收集被裝飾函數的參數
:param kwargs: 收集被裝飾函數的關鍵字參數
:return:
"""
if flag == "true":
start_time = time.time()
# 調用被裝飾的函數
result = func(*args, **kwargs)
# 讓進程睡一秒
time.sleep(1)
stop_time = time.time()
print("{func} spend {time} ".format(func="add", time=stop_time - start_time))
return result
else:
print("Unexpected ending")
return wrapper
return outer_wrapper
通過一個語法糖@符號來使用裝飾器
所謂的語法糖便是你不使用也可以完成任務,但是使用它可以讓你的代碼更簡潔
@timmer(flag="false")
def add(x, y):
print(x, y)
add(1,2)
被多個裝飾器裝飾
當函數被多個裝飾器裝飾時,從里向外裝飾
@a
@b
@c
def func():
pass
相當于
func = a(b(c(func)))
總結
以上是生活随笔為你收集整理的python3 装饰器_python3装饰器的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python编程基础人民邮电出版社_Py
- 下一篇: 现代永磁电机交流伺服系统_【每日文献】2