Python中帶引數的裝飾器的應用示例

2021-10-01 21:34:46 字數 1612 閱讀 1541

1. 帶引數的裝飾器的應用示例

裝飾器傳入的引數都是函式,返回值也是函式

現在想給裝飾器傳入一般的引數

裝飾器也是函式,現在只需要再裝飾器外面再加一層即可

要求:編寫裝飾器required_types, 條件如下:

# 1

). 當裝飾器為@required_types

(int,float)確保函式接收到的

每乙個引數都是int或者float型別;

# 2

). 當裝飾器為@required_types

(list)確保函式接收到的每乙個引數都是list型別;

# 3

). 當裝飾器為@required_types

(str,int)確保函式接收到的每

乙個引數都是str或者int型別;

# 4

). 如果引數不滿足條件, 列印 typeerror:引數必須為***x型別

import functools

def required_types

(*kinds)

: #定義帶引數的裝飾器函式

def required

(fun)

: @functools.

wraps

(fun)

(*args,

**kwargs)

:for i in args:

if not isinstance

(i,kinds)

: #如果實參的型別不滿足形參的要求,列印型別錯誤

# print

('typeerror:引數必須為'

,kinds)

# raise typeerror

('引數必須為%s,%s'

%kinds) #丟擲異常(後面會學到)

可以看到,當傳遞的實參和題目要求的形參一致時,直接進行求和運算

將實參變為int型,而此時形參依然是float型,將異常丟擲,可以看到,會報型別錯誤

python 帶引數裝飾器

在前面一文 python裡為什麼需要使用裝飾器 decorator 裡,我們學習了為什麼需要裝飾器,知道裝飾器就是為了不修改原來函式的 又達到增加功能的作用。其實為了裝飾器更通用化,那麼裝飾器是否也可以帶引數呢?其實是可以的,這樣更加通用化了,達到共享極點。在前面也學習 為什麼要使用閉包 closu...

python 實現帶引數的裝飾器

coding utf8 author bluesli defbefore request,kwarg print before defafter request,kwarg print after deffilter before fun,after fun defouter main fun de...

python 之 帶引數的裝飾器

from functools import wraps deflogit logfile out.log deflogging decorator func wraps func def args,kwargs log string func.name was called print log st...