由於語法糖@的限制,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...