python3如何給裝飾器傳遞引數

2021-04-18 23:09:07 字數 1951 閱讀 5288

1樓:巴拉小魔仙

def add(func): def wrap(num): ret = func(num) if num == 0:

print('test執行結來束自') return ret return wrap 你的遞迴bai函式有問題du哦zhi

,沒有dao終止

python 帶可變引數的裝飾器怎麼用

2樓:育知同創教育

裝飾器本身是用來是為一個函式是實現新的功能,並且不改變原函式的**以及呼叫方式。

遇到這樣一種問題:

眾多函式呼叫了你寫的裝飾器,但客戶有需求說,我想實現我可以隨之控制裝飾器是否生效。

那你就不可能在得到命令的時候去原函式頭部去做刪除和新增裝飾器呼叫的命令。這是就可以用到帶引數的裝飾器,定義一個開關,呼叫裝飾器的時候,把這個裝飾器的開關引數給傳遞進去,這樣當開關開啟的時候裝飾器生效,關閉的時候則只執行原函式的**。

舉例:開關引數為true的時候執行過程:

開關引數為false的時候執行過程:

python中一層裝飾器的函式可以帶引數嗎 20

3樓:我愛

可以的,

裝飾器分bai為可帶參du數和不可帶引數的兩種;zhi但是如果帶引數,dao

則帶專引數裝飾器的「屬引數」及「return」必須也是一個裝飾器具體可以參考一下下面的例子:

def deco1(func):

def w(x,*args,**kw):

print "this is deco1"

return x + " decorator"

return w

def deco2(deco):

print "this is deco2"

return deco

@deco2(deco1)

def func(x):

return x

print func("hello")

關於python裝飾器的問題

4樓:gta小雞

假設有帶參裝飾器decorator(*args, **kwargs),使用該裝飾器裝飾函式func(*args2, **kwargs2):

@decorator(*args, **kwargs)def func(*args2, **kwargs2):

...實際上是以下寫法的語版法糖:

def func(*args2, **kwargs2):

...func = decorator(*args, **kwargs)(func)

如你所權見,呼叫decorator(*args, **kwargs)返回的是一個callable物件(通常是一個函式,該函式用作內層裝飾器),然後進一步呼叫此callable物件並傳遞函式func作為引數,得到一個被裝飾過後的函式func',令變數func重新指向這個函式func'。因此,這種帶參的裝飾器通常有三層,外層裝飾器返回內層裝飾器,內層裝飾器返回裝飾後的函式。

python裝飾器應該怎麼理解?

5樓:匿名使用者

所謂裝飾器就是

把函式包裝一下,為函式新增一些附加功能,裝飾器就是一個函式,參內數為被包裝的函式,容返回包裝後的函式:你可以試下:

def d(fp):

def _d(*arg, **karg):

print "do sth before fp.."

r= fp(*arg, **karg)

print "do sth after fp.."

return r

return _d

@ddef f():

print "call f"

#上面使用@d來表示裝飾器和下面是一個意思#f = d(f)

f()#呼叫f

如何使用Python3讀寫INI配置檔案

import configparser 生成config物件 conf configparser.configparser 用config物件讀取配置檔案 conf.read ini 從ini配置檔案中獲取資訊 a conf.get xx yy print a 結果為 zz ini xx yy zz...

Python 2和Python 3有哪些主要區別

1.print不再是語句,而是函式,比如原來是 print abc 現在是 print abc 但是 python2.6 可以使用 from future import print function 來實現相同功能 2.在python 3中,沒有舊式類,只有新式類,也就是說不用再像這樣 class ...

python轉義雙引號,python中如何輸出引號

為啥一定都用雙引號呢?gp.calculatefield management a,type 林地 外面是單引號,裡面可以直接使用雙引號,不必轉義 如果使用變數代替可以這樣 a 林地 b s a gp.calculatefield management a,type b 也可以這樣 a 林地 b a...