裝飾器使用

2022-01-19 08:00:08 字數 1838 閱讀 7167

裝飾器本質上是乙個 python 函式或類,它可以讓其他函式或類在不需要做任何**修改的前提下增加額外功能,裝飾器的返回值也是乙個函式/類物件。它經常用於有切面需求的場景,比如:插入日誌、效能測試、事務處理、快取、許可權校驗等場景,裝飾器是解決這類問題的絕佳設計。有了裝飾器,我們就可以抽離出大量與函式功能本身無關的雷同**到裝飾器中並繼續重用。概括的講,裝飾器的作用就是為已經存在的物件新增額外的功能。

def

use_logging(func):

def logging.warn(

"%s is running

" % func.__name__

)

return func() #

把 foo 當做引數傳遞進來時,執行func()就相當於執行foo()

return

deffoo():

print('

i am foo')

foo = use_logging(foo) #

foo() #

如果你接觸 python 有一段時間了的話,想必你對 @ 符號一定不陌生了,沒錯 @ 符號就是裝飾器的語法糖,它放在函式開始定義的地方,這樣就可以省略最後一步再次賦值的操作。

def

use_logging(func):

def logging.warn(

"%s is running

" % func.__name__

)

return

func()

return

@use_logging

deffoo():

print("

i am foo")

foo()

如果我的業務邏輯函式 foo 需要引數怎麼辦

#args是乙個陣列,kwargs乙個字典

logging.warn("

%s is running

" % func.__name__

)

return func(*args, **kwargs)

@wraps使用裝飾器極大地復用了**,但是他有乙個缺點就是原函式的元資訊不見了,比如函式的docstring、__name__、引數列表而@wraps接受乙個函式來進行裝飾,

並加入了複製函式名稱、注釋文件、引數列表等等的功能。這可以讓我們在裝飾器裡面訪問在裝飾之前的函式的屬性,作用保持我們去裝飾的函式__name__值不變

例如:

def

logged(func):

@wraps(func)

def with_logging(*args, **kwargs):

print func.__name__

#輸出 'f'

print func.__doc__

#輸出 'does some math'

return func(*args, **kwargs)

return

with_logging

@logged

deff(x):

"""does some math

"""return x + x * x

多個裝飾器的執行順序是從上往下執行的

python裝飾器使用

根據裝飾器有參 無參,函式有參 無參,組合共4種 無參裝飾器 包裝無引數函式 不需要針對引數進行處理和優化 def decorator func 自定義處理邏輯 pass decorator def foo pass這樣呼叫foo 的時候等價於 foo decorator foo foo 無參裝飾器...

裝飾器使用案例

import numpy as np import pandas as pd import matplotlib.pyplot as plt import math import datetime from pandas import dataframe,series from copy impor...

python函式裝飾器使用詳解

def hint func def args,kwargs print is running format func.name return func args,kwargs hint defhello print hello 我們現在對hello已經進行了裝飾,當我們呼叫hello 時,我們可以看...