Python 有參裝飾器

2021-10-04 09:16:05 字數 4532 閱讀 3350

由於語法糖@的限制,outter函式只能有乙個引數,並且該才是只用來接收

被裝飾物件的記憶體位址

def

outter

(func)

:# func = 函式的記憶體位址

def(

*args,

**kwargs)

: res=func(

*args,

**kwargs)

return res

# @outter # outter(index)

# def index(x,y):

# print(x,y)

偷梁換柱之後:

錯誤演示一:

def

auth

(func,db_type)

:def

(*args,

**kwargs)

: name=

input

('your name>>>: '

).strip(

) pwd=

input

('your password>>>: '

).strip(

)if db_type ==

'file'

:print

('基於檔案的驗證'

)if name ==

'egon'

and pwd ==

'123'

: res = func(

*args,

**kwargs)

return res

else

:print

('user or password error'

)elif db_type ==

'mysql'

:print

('基於mysql的驗證'

)elif db_type ==

'ldap'

:print

('基於ldap的驗證'

)else

:print

('不支援該db_type'

)# @auth # 賬號密碼的**是檔案

defindex

(x,y)

:print

('index->>%s:%s'

%(x,y)

)# @auth # 賬號密碼的**是資料庫

defhome

(name)

:print

('home->>%s'

%name)

# @auth # 賬號密碼的**是ldap

deftransfer()

:print

('transfer'

)index=auth(index,

'file'

)home=auth(home,

'mysql'

)transfer=auth(transfer,

'ldap'

)index(1,

2)home(

'egon'

)transfer(

)

錯誤演示二:

def

auth

(db_type)

:def

deco

(func)

:def

(*args,

**kwargs)

: name=

input

('your name>>>: '

).strip(

) pwd=

input

('your password>>>: '

).strip(

)if db_type ==

'file'

:print

('基於檔案的驗證'

)if name ==

'egon'

and pwd ==

'123'

: res = func(

*args,

**kwargs)

return res

else

:print

('user or password error'

)elif db_type ==

'mysql'

:print

('基於mysql的驗證'

)elif db_type ==

'ldap'

:print

('基於ldap的驗證'

)else

:print

('不支援該db_type'

) return deco

deco=auth(db_type=

'file'

)@deco # 賬號密碼的**是檔案

defindex

(x,y)

:print

('index->>%s:%s'

%(x,y)

)deco=auth(db_type=

'mysql'

)@deco # 賬號密碼的**是資料庫

defhome

(name)

:print

('home->>%s'

%name)

deco=auth(db_type=

'ldap'

)@deco # 賬號密碼的**是ldap

deftransfer()

:print

('transfer'

)index(1,

2)home(

'egon'

)transfer(

)

def

auth

(db_type)

:def

deco

(func)

:def

(*args,

**kwargs)

: name =

input

('your name>>>: '

).strip(

) pwd =

input

('your password>>>: '

).strip(

)if db_type ==

'file'

:print

('基於檔案的驗證'

)if name ==

'egon'

and pwd ==

'123'

: res = func(

*args,

**kwargs)

# index(1,2)

return res

else

:print

('user or password error'

)elif db_type ==

'mysql'

:print

('基於mysql的驗證'

)elif db_type ==

'ldap'

:print

('基於ldap的驗證'

)else

:print

('不支援該db_type'

) return deco

@auth(db_type=

'file'

)def

index

(x, y)

:print

('index->>%s:%s'

%(x, y)

)@auth(db_type=

'mysql'

)def

home

(name)

:print

('home->>%s'

% name)

@auth(db_type=

'ldap'

)# 賬號密碼的**是ldap

deftransfer()

:print

('transfer'

)# index(1, 2)

# home('egon')

# transfer()

def 有參裝飾器(x,y,z)

:def

outter

(func)

:def

(*args,

**kwargs)

: res = func(

*args,

**kwargs)

return res

return outter

@有參裝飾器(

1,y=

2,z=3)

def 被裝飾物件():

pass

裝飾器 有參裝飾器

有參裝飾器 是為裝飾器提供多樣功能選擇的實現提供的,實現原理是三層閉包。有參裝飾器的基本模板 def outter x defoutter1 func res func args,kwargs print x return res return return outter1 通過第三層進行傳值,使得...

有參裝飾器

import time current user def deco func if current user user 已經登陸過 res func args,kwargs return res user input username strip pwd input password strip i...

python裝飾器 有殘裝飾器 無參裝飾器

裝飾器 修飾別人的工具,修飾新增功能,工具指的是函式 裝飾器本身可以是任何可呼叫物件,被裝飾的物件也可以是任意可呼叫物件 為什麼要用裝飾器 開放封閉原則 對修改是封閉的,對擴充套件是開放的 裝飾器就是為了在不修改被裝飾物件的源 以及呼叫方式的前提下,為期新增新功能 基本裝飾器 usr bin pyt...