被修飾的函式引數個數是不固定的,而要修改引數個數就肯定需要修改裝飾器和原函式,違反了裝飾器的修改原函式源**的原則。
而基本裝飾器本來是不帶有引數的,如果呼叫原函式需要傳入引數怎麼辦?可以如下操作:
#裝飾器
import time
deftimmer
(func)
:def
wrap
(*args,
**kwargs)
:#乙個接收列表,乙個接收字典,用容器作為引數就可以不限引數個數了
#相當於:foo('夏洛特玲玲','50','female','拿破崙','卡塔庫慄'),
#args=['夏洛特玲玲','50','female','拿破崙','卡塔庫慄'],kwargs=
start_time = time.time(
)#給裝飾器加的功能
res = func(
*args,
**kwargs)
#在裝飾器中執行函式,並且用乙個變數來接收以返回原函式的返回值
stop_time = time.time(
)print
('函式執行了{}秒'
.format
(stop_time - start_time)
)return res #返回原函式的返回值
return wrap #函式的返回值是函式,所以為高階函式
#原函式
@timmer #語法糖的使用,使原函式即foo函式被裝飾。相當於foo = timmer(foo)語句
deffoo
(name,age,***,weapen,son)
: time.sleep(3)
print
('test函式執行完畢!\n名字:%s,年齡:%s, 性別:%s,**:%s,兒子:%s'
%(name,age,***,weapen,son)
)return
'這是test的返回值'
#為了實現把原函式的返回值也接收到
#呼叫被修飾後的原函式
foo(
'夏洛特玲玲'
,'50'
,'female'
,'拿破崙'
,'卡塔庫慄'
)#執行原函式,方式不變,滿足原則
#可以看到,加了*args和*kargs後就無論多少個引數都能正常執行了
執行結果:
test函式執行完畢!
名字:夏洛特玲玲,年齡:50, 性別:female,**:拿破崙,兒子:卡塔庫慄
函式執行了3.0121726989746094秒
user_list =
[#查詢密碼的列表,包含所有的賬號密碼
,#重點知識:因為你輸入的是字串,
,#所以你字典的value也必須是字串格式,不能是數字格式的值,]
current_dic =
#記錄當前使用者登陸狀態的字典
#帶驗證功能的裝飾器
defauth_func
(func)
:def
(*args,
**kwargs)
:if current_dic[
'username'
]and current_dic[
'login']:
#如果都為true就執行,即輸入過賬號密碼後就不需要再次輸入了
res = func(
*args,
**kwargs)
#直接執行,不需要再輸入賬號密碼
return res
#否則就輸入賬號密碼
username =
input
('使用者名稱:'
).strip(
)#讓使用者輸入登陸資訊
passwd =
input
('密碼:'
).strip(
)#遍歷字典來匹配賬號密碼是否正確
for user_dic in user_list:
#user_dic是用來遍歷列表中每個字典的變數
#print(user_dic['name'],user_dic['passwd'])
if user_dic[
'name'
]== username and user_dic[
'passwd'
]== passwd:
#驗證賬號密碼
#print(user_dic['name'],user_dic['passwd'])
#輸入正確就記錄下登陸狀態,用記錄狀態的字典
current_dic[
'username'
]= username
current_dic[
'login']=
true
#print(current_dic['login'])
res = func(
*args,
**kwargs)
#接收原函式返回值
return res
#else跟for成對,表明如果你輸入的連使用者名稱都不存在,那就不用遍歷了
else
:print
('使用者名稱或密碼錯誤!!!'
)@auth_func
defindex()
:print
('歡迎來到**主頁!'
)@auth_func
defhome
(name)
:print
('歡迎%s回家'
%name)
@auth_func
defshopping_car
(name)
:print
('%s的購物車裡有:%s、%s、%s'
%(name,
'連衣裙'
,'海賊手辦'
,'迪迦凹凸曼'))
print
('初始使用者狀態:'
,current_dic)
index(
)print
('輸入後使用者狀態:'
,current_dic)
home(
'您')
#該函式無論傳入什麼值都可以,只是給函式內部多乙個全域性變數
shopping_car(
'您')
執行結果:
初始使用者狀態:
使用者名稱:索隆
密碼:2222
歡迎來到**主頁!
輸入後使用者狀態:
歡迎您回家
您的購物車裡有:連衣裙、海賊手辦、迪迦凹凸曼
初學者python筆記(裝飾器 高階函式 閉包)
乙個函式被定義完成後,甚至程式發布後,後期可能需要新增某些功能,但是我們不可能每次都去修改原函式的 這時候裝飾器就可以上場了,本篇文章將會用乙個個可實現的 由淺入深 循序漸進得闡述裝飾器的強大之處 裝飾器定義 作用 原則 定義 乙個裝飾函式的函式,即為其他函式新增附加功能 作用 給函式新增新功能,但...
適合初學者的Python裝飾器簡易教程
裝飾器是python程式語言中相當高階的一部分。就像大多數事情一樣,一旦你掌握了它們的工作原理並使用了幾次,它們就會變得非常簡單明瞭,但是作為乙個初學者,它們可能會有點讓人望而生畏,很難理解。只有理解了它所解決的問題,你才能真正理解它。例如,我可以直接宣告裝飾器的定義 decorator是乙個函式,...
python 初學者計算器
神獸保佑 考試及格!from tkinter import class calc definit self self.num1 self.num2 self.結果 self.顯示內容 self.輸入開關 true self.運算符號 0 self.載入視窗 def 輸入數字 self,數字 if s...