1.裝飾器定義:
裝飾器本質上是乙個python函式,它可以讓其他函式在不需要做任何**變動的前提下增加額外功能,裝飾器的返回值也是乙個函式物件。
它經常用於有切面需求的場景,比如:插入日誌、效能測試、事務處理、快取、許可權校驗等場景。裝飾器是解決這類問題的絕佳設計,有了裝飾器,我們就可以抽離出大量與函式功能本身無關的雷同**並繼續重用。
概括的講,裝飾器的作用就是為已經存在的函式或物件新增額外的功能。
2.裝飾器使用:
首先我們需要知道:
開放封閉原則:
示例:需求:遵守開發封閉的原則,在呼叫f1()/f2()函式時,先列印出《python自動化測試實戰》這句話,再輸出f1或f2的值
def1.執行getinfo函式的時候,把被裝飾的函式f1當做引數來傳遞getinfo(func):
definner():
print('《python自動化測試實戰》'
) func()
return
inner
@getinfo #裝飾器
deff1(): #被裝飾的函式,就是裝飾器的引數
print('網易雲課堂'
)def
f2():
print('51cto平台')
f1()
#**執行順序:
1.執行呼叫f1()
2.先執行getinfo函式,找到inner函式,輸出: 《python自動化測試實戰》
3.再執行func()函式,實際上就是func=f1(),輸出: 網易雲課堂
四個步驟:
2.getinfo函式的返回值會出現賦值
3.一旦結合了裝飾器後,呼叫f1的函式其實執行的是inner函式的內部,原來的函式f1被覆蓋
4.被裝飾的函式f1出現賦值給裝飾器的內層函式inner
3.登入案例
deflogin(func): #func=frofile
def inner(token='
krjgefj'):
if token=='
krjgefj':
return
func(token)
else
:
return
'請登入系統'
return
inner
@login
defprofile(token): #帶了引數
return
'你的主頁資訊'
print(profile('
krjgefj
'))
#**執行順序
1.在呼叫profile()函式之前先執行login函式
2.判斷引數是否等於krjgefj,等於的話就直接執行func(token)函式,即profile(token)
針對帶不定引數的裝飾器寫法:
def outer(func):
def inner(*args,**kwargs):
print(args,kwargs)
func()
return inner
4.實戰
需求:要求註冊賬戶,然後註冊的賬戶登入到系統後,顯示出登入的暱稱
1.註冊的函式
2.登入的函式
3.登入後獲取暱稱的函式
傳統寫法:重複**較多
defregister():
'''實現賬戶的註冊功能
'''username=input('
請輸入賬號:\n')
password=input('
請輸入密碼:\n')
'''把獲取到賬戶資訊寫入當前目錄的檔案login.md
'''temp=username+'
|'+password #
用|進行分割
with open('
login.md
','w
') as f:
f.write(temp)
deflogin():
'''實現登入功能
'''username=input('
請輸入賬號:\n')
password=input('
請輸入密碼:\n')
'''讀取login.md的內容
'''with open(
'login.md
','r
') as f:
info=f.read()
info=info.split('
|') #
用|進行分割
if username==info[0] and password==info[1]:
return
true
else
:
return
false
defgetnick(func):
'''獲取暱稱
'''with open(
'login.md
','r
') as f:
info=f.read()
info=info.split('
|') #
用|進行分割
iffunc:
print('
您好,歡迎你訪問無涯課堂
'.format(info[0]))
else
:
print('
請登入系統
')
if__name__ == '
__main__':
while
true:
t = int(input('
1.註冊 2.登入 3.退出系統\n'))
if t==1:
register()
elif t==2:
getnick(login())
elif t==3:
import
sys
sys.exit(1) #退出
else
:
print('
輸入錯誤,請繼續...')
contunie
修改後,把重複**提出來的寫法:
definout():
username=input('
請輸入賬號:\n')
password=input('
請輸入密碼:\n')
return
username,password
defregister():
'''實現賬戶的註冊功能
'''username,password=inout()
'''把獲取到賬戶資訊寫入當前目錄的檔案login.md
'''temp=username+'
|'+password #
用|進行分割
with open('
login.md
','w
') as f:
f.write(temp)
deflogin():
'''實現登入功能
'''username,password=inout()
'''讀取login.md的內容
'''with open(
'login.md
','r
') as f:
info=f.read()
info=info.split('
|') #
用|進行分割
if username==info[0] and password==info[1]:
return
true
else
:
return
false
defgetnick(func):
'''獲取暱稱
'''with open(
'login.md
','r
') as f:
info=f.read()
info=info.split('
|') #
用|進行分割
iffunc:
print('
您好,歡迎你訪問無涯課堂
'.format(info[0]))
else
:
print('
請登入系統')
if__name__ == '
__main__':
while
true:
t = int(input('
1.註冊 2.登入 3.退出系統\n'))
if t==1:
register()
elif t==2:
getnick(login())
elif t==3:
import
sys
sys.exit(1) #
退出else
:
print('
輸入錯誤,請繼續...')
contunie
Python學習筆記(二) 函式
呼叫函式 abs max min hex 整數轉換成十六進製制 資料型別轉換 int float str bool 定義函式 定義乙個函式要使用 def語句,依次寫出函式名 括號 括號中的引數和冒號 然後,在縮排塊中編寫函式體,函式的返回值用 return 語句返回。def my abs x if ...
Python學習筆記 二 函式
python有很多自帶的函式,在api裡很容易找到 菜鳥教程的python內建函式講的也不錯 這裡先試試幾個能猜的出作用的簡單函式 函式名描述 abs 返回數字的絕對值 abs 1 1 all 判斷給定的可迭代引數 iterable 中的所有元素是否都為 true,如果是返回 true,否則返回 f...
Python學習筆記 函式(二)
序列解包 傳遞引數時,可以用過在實參序列前加乙個 號將其解包,然後傳遞給多個單變數形參 如果函式實參是字典,可以在前面加 號進行解包,等價於關鍵字引數。作用域 變數起作用的 範圍稱為變數的作用域,不同作用域內變數名可以相同,不影響。根據變數可供訪問的作用範圍,分為全域性變數和區域性變數。全域性變數自...