日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

python3 装饰器_python3装饰器

發布時間:2025/4/16 13 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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装饰器的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。