3. reference
購物車場景,有兩個函式get_name和get_info,已實現
def
get_name
(sess)
: name = sess[
'name'
]return name
defget_info
(sess)
: info = sess[
'info'
]return info
假設現在接到乙個需求,需驗證登入後才能獲取name和info。如果我們在已有原始碼上直接修改,即新增if語句,這會違反開閉原則(對擴充套件開放,對修改關閉)。這裡介紹python開發模式中一款強大的工具——裝飾器(24種開發模式就是強大)。
直接用**實現,有
def
get_name
(sess)
: name = sess[
'name'
]return name
defget_info
(sess)
: info = sess[
'info'
]return info
def(func, sess)
: is_login = sess[
'is_login'
]if is_login:
return func(sess)
else
:return
none
def(func, sess)
: level = sess[
'level'
]if level >5:
return func(sess)
else
:return
none
if __name__ ==
'__main__'
:# 接到需求1:需驗證是否登入
sess =
print
(name)
sess =
print
(name)
# 中途改需求,接到需求2:轉為需驗證等級
sess =
print
(name)
sess =
print
(name)
執行結果:使用更加簡便的寫法,有
from functools import wraps
def(func)
: @wraps(func)
def_check
(*args,
**kwargs)
:# print(args)
# print(type(args))
# print(type(args[0]))
sess = args[0]
if sess[
'is_login']:
return func(
*args,
**kwargs)
else
:return
none
return _check
defget_name
(sess)
: name = sess[
'name'
]return name
defget_info
(sess)
: info = sess[
'info'
]return info
if __name__ ==
'__main__'
: sess =
print
(get_name(sess)
)print
(get_info(sess)
) sess =
print
(get_name(sess)
)print
(get_info(sess)
)
執行結果:若get_***函式不帶引數,有
def
(func)
:def
_check()
:print
('write to log.txt'
, func.__name__)
# 記錄到日誌裡
return func(
)return _check
defget_name()
:return
'name'
defget_info()
:return
'info'
if __name__ ==
'__main__'
:print
(get_name())
print
(get_info(
))
執行結果:
write to log.txt get_name
name
write to log.txt get_info
info
符號@的裝飾器可以帶引數,有
def
(log_path)
:def
(func)
:def
_check
(sess)
:print
(log_path, end=
'\t'
)if sess[
'is_login']:
return func(sess)
else
:return
none
return _check
def(func)
:def
_check
(sess)
:if sess[
'level'
]>=3:
return func(sess)
else
:return
none
return _check
# 呼叫get_name方法時記錄到log_name.txt日誌中去
'd:/log_name.txt'
)def
get_name
(sess)
: name = sess[
'name'
]return name
# 接到新需求,呼叫get_info方法時需同時驗證登入和等級
)def
get_info
(sess)
: info = sess[
'info'
]return info
if __name__ ==
'__main__'
:print()
sess =
print
(get_name(sess)
)print
(get_info(sess)
)print()
sess =
print
(get_name(sess)
)print
(get_info(sess)
)print()
sess =
print
(get_name(sess)
)print
(get_info(sess)
)print
()
執行結果:
其實上述用法等價於
def
(log_path)
:def
(func)
:def
_check
(sess)
:print
(log_path, end=
'\t'
)if sess[
'is_login']:
return func(sess)
else
:return
none
return _check
def(func)
:def
_check
(sess)
:if sess[
'level'
]>=3:
return func(sess)
else
:return
none
return _check
defget_name
(sess)
: name = sess[
'name'
]return name
defget_info
(sess)
: info = sess[
'info'
]return info
if __name__ ==
'__main__'
: sess =
'e:/log_name.txt'
)(get_name)
print
(get_name_1(sess)
)'e:/log_info.txt'
)(get_info_1)
print
(get_info_1(sess)
)
執行結果:python函式修飾符@的使用
手把手帶你學會python
python裝飾器示例
目標 1.編寫執行函式,生成10個數的列表,沒生成乙個睡眠一會 2.編寫裝飾器,完成函式耗時計算 1.編寫生成10個數的列表,並睡眠0.2s import time def loop result for i in range 10 time.sleep 0.2 return result 乙個.p...
裝飾器示例
接收的時候是聚合 呼叫的時候打散 def def inner args,kwargs print 在裝飾器的函式執行之前 ret func args,kwargs print 在之後 return ret return inner defholidary day print 全天放假 s day r...
python 驗證功能的裝飾器示例
user list current dict defauth auth type defauth func func print 認證型別 auth type if auth type filedb if current dict username and current dict login 判斷...