python中 的乙個用法(裝飾器)

2021-08-29 09:56:00 字數 1744 閱讀 1903

之前寫**遇到乙個函式的上一行有格式為

@函式名

因此做了一些學習,這玩意叫裝飾器,它用來裝飾乙個函式,裝飾器fun1(),引數必須是函式名,返回值也必須是乙個函式!!!

在python中允許函式名作為另乙個函式的引數,即fun1(fun2),注意不能寫成fun1(fun2())。

從下面的例子當中可以看到,fun2()和fun3()兩個函式體內容差不多,乙個用了裝飾器,乙個用了函式巢狀呼叫,結果也類似。

其中**段

@fun1         

def fun2():

print("function2")

相當於 fun1(fun2) 函式巢狀呼叫,

或者說,相當於   fun2 = fun1(fun2),還記得剛剛說過的吧,fun1()返回值是乙個函式,所以fun1(fun2)的結果賦值給fun2,fun2依舊是乙個函式,只是此時已經被裝飾過了。

def fun1(funname): #這個funname是乙個函式的名字,函式名字作為另乙個函式的引數

print("initial function")

return funname() #也可以不用寫返回值,直接funname()也行

@fun1 # 相當於 fun1(fun2) 函式巢狀呼叫

def fun2():

print("function2")

def fun3():

print("function3")

print("分割線---------------")

fun1(fun3) #不能寫成fun1(fun3())

結果:

initial function

function2

分割線---------------

initial function

function3

注:return funname() 不要寫成 return funname !!!要加括號

請移步原文

class mydecorator(object):

def __init__(self, func):

print "inside mydecorator.__init__()"

self.func = func

def __call__(self):

self.func()

print "inside mydecorator.__call__()"

@mydecorator

def afunction():

print "inside afunction()"

print "finished decorating afunction()"

afunction()

# output:

# inside mydecorator.__init__()

# finished decorating afunction()

# inside afunction()

# inside mydecorator.__call__()

我們可以看到這個類中有兩個成員:

乙個是__init__(),這個方法是在我們給某個函式decorator時被呼叫,所以,需要有乙個func的引數,也就是被decorator的函式。

乙個是__call__(),這個方法是在我們呼叫被decorator函式時被呼叫的

乙個裝飾器裝飾乙個函式

2 如果鍵不存在,則新增到字典中。請使用裝飾器來實現,順便複習下 args和 kwargs的用法 a defselect func def inner args,kwargs if len args 0 if kwargs key in kwargs data print 鍵存在 else func...

Python實現乙個裝飾器

在不改變原函式的呼叫以及內部 情況下,為其新增新功能的函式。實現乙個裝飾器 def print func name func 提供舊功能 print func.name 新功能 return func args,kwargs 舊功能 print func name say hello print f...

自己編寫乙個裝飾器中的裝飾器函式

看了 大道曙光 的 functools模組wraps裝飾器的用途 的文章。基本上弄清了wraps的工作原理,為了檢驗一下自己理解的程度,於是動手寫乙個類似的 wraps函式,請大家指教。測試 debug log sys.stderr def trace func if debug log mywra...