python學習筆記二函式裝飾器

2022-07-10 12:15:17 字數 4706 閱讀 9872

1.裝飾器定義:

裝飾器本質上是乙個python函式,它可以讓其他函式在不需要做任何**變動的前提下增加額外功能,裝飾器的返回值也是乙個函式物件。

它經常用於有切面需求的場景,比如:插入日誌、效能測試、事務處理、快取、許可權校驗等場景。裝飾器是解決這類問題的絕佳設計,有了裝飾器,我們就可以抽離出大量與函式功能本身無關的雷同**並繼續重用。

概括的講,裝飾器的作用就是為已經存在的函式或物件新增額外的功能

2.裝飾器使用:

首先我們需要知道:

開放封閉原則:

示例:需求:遵守開發封閉的原則,在呼叫f1()/f2()函式時,先列印出《python自動化測試實戰》這句話,再輸出f1或f2的值

def

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(),輸出: 網易雲課堂

四個步驟:

1.執行getinfo函式的時候,把被裝飾的函式f1當做引數來傳遞

2.getinfo函式的返回值會出現賦值

3.一旦結合了裝飾器後,呼叫f1的函式其實執行的是inner函式的內部,原來的函式f1被覆蓋

4.被裝飾的函式f1出現賦值給裝飾器的內層函式inner    

3.登入案例

def

login(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.登入後獲取暱稱的函式

傳統寫法:重複**較多

def

register():

'''實現賬戶的註冊功能

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

修改後,把重複**提出來的寫法:

def

inout():

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學習筆記 函式(二)

序列解包 傳遞引數時,可以用過在實參序列前加乙個 號將其解包,然後傳遞給多個單變數形參 如果函式實參是字典,可以在前面加 號進行解包,等價於關鍵字引數。作用域 變數起作用的 範圍稱為變數的作用域,不同作用域內變數名可以相同,不影響。根據變數可供訪問的作用範圍,分為全域性變數和區域性變數。全域性變數自...