初學者python筆記(裝飾器後篇 登陸驗證)

2021-10-03 14:32:09 字數 3285 閱讀 2073

被修飾的函式引數個數是不固定的,而要修改引數個數就肯定需要修改裝飾器和原函式,違反了裝飾器的修改原函式源**的原則。

而基本裝飾器本來是不帶有引數的,如果呼叫原函式需要傳入引數怎麼辦?可以如下操作:

#裝飾器

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...