def
hint
(func)
:def
(*args,
**kwargs)
:print
('{} is running'
.format
(func.__name__)
)return func(
*args,
**kwargs)
@hint
defhello()
:print
("hello!"
)
我們現在對hello已經進行了裝飾,當我們呼叫hello()時,我們可以看到如下結果。
>>> hello()
hello is running.
hello!
>>>hello.__name__
為了解決這個問題保證裝飾過的函式__name__屬性不變,我們可以使用functools模組裡的wraps方法,先對func變數進行wraps。下面這段**可以作為編寫乙個通用裝飾器的示範**,注意收藏哦。
from functools import wraps
defhint
(func)
: @wraps(func)
def(
*args,
**kwargs)
:print
('{} is running'
.format
(func.__name__)
)return func(
*args,
**kwargs)
@hint
defhello()
:print
("hello!"
)
恭喜你,你已經學會寫乙個比較通用的裝飾器啦,並保證裝飾過的函式__name__屬性不變啦。當然使用巢狀函式也有缺點,比如不直觀。這時你可以借助python的decorator模組(需事先安裝)可以簡化裝飾器的編寫和使用。如下所示。
編輯帶引數裝飾器
from functools import wraps
defhint
(coder)
:def
(func)
: @wraps(func)
def(
*args,
**kwargs)
:print
('{} is running'
.format
(func.__name__)
)print
('coder: {}'
.format
(coder)
)return func(
*args,
**kwargs)
@hint(coder=
"john"
)def
hello()
:print
("hello!"
)
python裝飾器使用
根據裝飾器有參 無參,函式有參 無參,組合共4種 無參裝飾器 包裝無引數函式 不需要針對引數進行處理和優化 def decorator func 自定義處理邏輯 pass decorator def foo pass這樣呼叫foo 的時候等價於 foo decorator foo foo 無參裝飾器...
裝飾器使用
裝飾器本質上是乙個 python 函式或類,它可以讓其他函式或類在不需要做任何 修改的前提下增加額外功能,裝飾器的返回值也是乙個函式 類物件。它經常用於有切面需求的場景,比如 插入日誌 效能測試 事務處理 快取 許可權校驗等場景,裝飾器是解決這類問題的絕佳設計。有了裝飾器,我們就可以抽離出大量與函式...
裝飾器使用案例
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...