python函式之有參裝飾器

2022-07-15 00:24:16 字數 4674 閱讀 5204

一、為什麼要有有參裝飾器?

來看之前的無參裝飾器

#

無參裝飾器

defoutter(func):

start =time.time()

res = func(*args,**kwargs) #

我們需要乙個變數接受函式的返回值

end =time.time()

print("

run time is %s

" % (end -start))

return res #

return

@outter

#@+裝飾器名稱,可以快速完成 pint1 = outter(print1)的函式賦值

defprint1(name):

print

(name)

time.sleep(1)

return 111

首先看一下無參裝飾器能否實現:

#

認證功能裝飾器

defoutter(func):

name = input("

請輸入使用者名稱》")

pwd = input("

請輸入密碼》")

if mode == "

1": #

需要通過mode進行判斷資訊**,但是沒有引數傳入

if name == "

zhangda

"and pwd == "

123"

:

print("

登陸成功!")

res1 = func(*args,**kwargs)

return

res1

else

:

print("

使用者名稱或者密碼錯誤")

elif mode == "2"

: #需要通過mode進行判斷資訊**,但是沒有引數傳入

print("")

else

: print("

未知**")

我們可以在最外層函式進行傳入

#認證功能裝飾器

defoutter(func):

mode = "

file

" name = input("

請輸入使用者名稱》")

pwd = input("

請輸入密碼》")

if mode == "1"

:

if name == "

zhangda

"and pwd == "

123"

:

print("

登陸成功!")

res1 = func(*args,**kwargs)

return

res1

else

:

print("

使用者名稱或者密碼錯誤")

elif mode == "2"

:

print("")

else

:

print("

未知**")

return

@outter

deff1():

print("

hhhhh

")

但是這樣每次使用裝飾器都需要修改,並且不能同時滿足多個資訊**需求,回想之前給函式傳參的兩種方法,既然直接傳參行不通,我們想到了利用閉包函式特性,再包一層函式,這就是有參裝飾器

def outter2(mode="

file"):

defoutter(func):

name = input("

username:

").strip()

pwd = input("

password:

").strip()

if mode == "

file":

if name == "

egon

"and pwd == "

123"

:

print("

登陸成功!")

res = func(*args,**kwargs)

return

res

else

:

print("

登陸失敗!")

elif mode == "

mysql":

print("

基於mysql認證!")

else

:

print("

未知**認證!")

return

return

outter

@outter2(

"mysql")

defindex(name):

print("{}"

.format(name))

index(

"hhhhhh

")

在這裡將之前的裝飾器outter看做乙個整體,對他進行裝飾,並且最外層函式可以傳入任意引數的,有參裝飾的語法糖:@函式名(引數1,引數2......)

二、裝飾器wraps

我們知道,裝飾器其實就是定義了乙個閉包函式,包含了原來的函式與功能並且新增新功能,最後通過函式物件賦值實現了全域性呼叫,但是函式記憶體位址已經改變,只是名稱看著一樣

def

outter(func):

""""""

print("

11111")

res = func(*args,**kwargs)

return

res

return

@outter

defindex():

"""index注釋

"""print("

2222")

print(index.__name__) #

列印函式的名稱

print(index.__doc__) #

列印函式的注釋

print(index) #

列印函式記憶體位址

執行結果如下:

"""index注釋

"""print("

2222")

print(index.__name__) #

列印函式的名稱

print(index.__doc__) #

列印函式的注釋

print(index) #

列印函式記憶體位址

其實python內建了乙個庫functools,提供了裝飾器實現這一功能,用法如下:

from functools import

wraps

defoutter(func):

@wraps(func)

""""""

print("

11111")

res = func(*args,**kwargs)

return

res ##

return

@outter

defindex():

"""index注釋

"""print("

2222")

print(index.__name__) #

列印函式的名稱

print(index.__doc__) #

列印函式的注釋

print(index) #

列印函式記憶體位址

三、總結

裝飾器模板

def

outter(func):

res = func(*args,**kwargs)

return

res

defoutter2(x):

defoutter(func):

print

(x) res = func(*args,**kwargs)

return

res

return

return

outter

@outter2("1

")deff1():

print("

2")

python之有參裝飾器

由於語法糖 的限制,outter函式只能有乙個引數,並且該引數只用來接收被裝飾物件的記憶體位址 def outter func func 函式的記憶體位址 res func args,kwargs return res outter outter outter index def index x,y...

python中裝飾器之有參裝飾器(三)

在呼叫無參裝飾器時,不需要在外層傳遞引數。適用於例如 為某個函式增加統計執行時間功能 為某個函式執行前增加登入認證功能 在呼叫有參裝飾器時,對其傳入乙個或多個引數。適用於例如 驗證使用者型別 def user auth user group def def inner args,kwargs if ...

python之有參裝飾器和迭代器用法

1.有參裝飾器 是無參裝飾器的加強版 在無參裝飾器上面再包個函式 相當於多增加乙個值 無參裝飾器函例圖 def check func index 執行的先執行 check check index 把index記憶體位址賦值給func 得到check user記憶體位址返回值並賦值新的index變數名...