day4 裝飾器深入解析

2022-08-03 19:30:20 字數 3917 閱讀 6254

python裝飾器

裝飾器是在不修改原始碼給**新增功能的常用方法。@是裝飾的標誌。我們知道,在給**增加功能的時候,要遵循開放封閉的原則,不能隨便更改原碼,因此裝飾器的功能就顯示出來了,只需要在函式前面加上裝飾器就能解決問題所需。

def verification(func):

#驗證模組

def inner():

print(

"請輸入你的賬號和密碼進行驗證")

func()

return

inner

def f1():

print(

666)

def f2():

print(

777)

def f3():

print(

888)

def f4():

print(

999)

f2 =verification(f2)

print(f2)

f2()

上面**中,我們給f2增加了乙個驗證功能,很多時候,我們需要在不改變原碼的情況下對程式的功能進行擴充套件。上面是裝飾器的原理。裝飾器相當於在函式上面新增了一句**f = func(f),讓程式在執行的時候能夠先進行驗證,下面來看一下完整的裝飾器。

def verification(func):

#驗證模組

def inner():

print(

"請輸入你的賬號和密碼進行驗證")

func()

return

inner

def f1():

print(

666)

def f2():

print(

777)

def f3():

print(

888)

def f4():

print(

999)

f1 =verification(f1)

f2 =verification(f2)

f3 =verification(f3)

f4 =verification(f4)

f2() #此處f2即inner的函式位址,執行f2()其實執行的是inner()

上述**中,我們增加了四局**,使我們能夠在不修改原碼的情況下,對程式進行了擴充,並且沒有改變其他部門使用人的習慣,很好的解決了問題,這種方法其實就是裝飾器的原理。我們進行簡單的修改就能夠更加好看和美觀。

def verification(func):

#驗證模組

def inner():

print("請輸入你的賬號和密碼進行驗證")

func()

return inner

@verification #f1 = verification(f1)

def f1():

print(666)

@verification #等價於f2 = verification(f2)

def f2():

print(777)

@verification #f3 = verification(f3)

def f3():

print(888)

@verification #f4 = verification(f4)

def f4():

print(999)

f2() #此處f2即inner的函式位址,執行f2()其實執行的是inner()

上面**中,我們應用了裝飾器@,也實現了與上面**一樣的功能,其實函式f1上面的裝飾器@verification等價於f1 = verification(f1)這句話,讓我們在進行函式之前,首先執行驗證**塊,由於verification(f1)是執行驗證函式,此時使用者還沒有呼叫,但是函式已經執行,為了不讓函式執行驗證模組,我們增加了一層函式巢狀,在第二層進行巢狀,第一層的作用是返回第二層巢狀函式的函式名,以便在使用者輸入呼叫的時候在進行呼叫,所以使用者在呼叫的時候,輸入f2()其實等於執行了函式inner()。此時inner()函式也啟用了,在python記憶體中存在。

因此,如果我們不想某層函式執行的話,就給函式巢狀一層函式,返回第一層函式的函式名,在第二層進行執行。我們也可以給函式增加引數,要知道是那個函式在執行命令。

給函式傳遞引數,給函式傳遞乙個引數,由於我們知道,使用者呼叫f2()的時候,其實執行的是inner(),因此inner()的引數與func()一樣多。下面我們來給裝飾器傳遞乙個引數。

def verification(func):

#驗證模組

def inner(name):

print(

"請輸入你的賬號和密碼進行驗證")

func(name)

return

inner

@verification #f1 =verification(f1)

def f1(name):

print(

666)

@verification #等價於f2 =verification(f2)

def f2(name):

print(

777,name)

@verification #f3 =verification(f3)

def f3(name):

print(

888)

@verification #f4 =verification(f4)

def f4():

print(

999)

f2("

alex

") #此處f2即inner的函式位址,執行f2()其實執行的是inner()

傳遞多組引數:

def verification(func):

#驗證模組

def inner(*args,**kwargs):

print("請輸入你的賬號和密碼進行驗證")

func(*args,**kwargs)

return inner

@verification #f1 = verification(f1)

def f1(name):

print(666)

@verification #等價於f2 = verification(f2)

def f2(name):

print(777,name)

@verification #f3 = verification(f3)

def f3(name,age,*args):

print(888,name,age,args)

@verification #f4 = verification(f4)

def f4():

print(999)

f2("alex") #此處f2即inner的函式位址,執行f2()其實執行的是inner()

f3("alex","sb","is",333,222)

我們結合之前學習的動態引數*args,**kwargs可以給函式傳遞多個引數,這樣能滿足使用者傳入多個引數不會出錯的情況。

上面**執行結果如下:

請輸入你的賬號和密碼進行驗證

777 alex

請輸入你的賬號和密碼進行驗證

888 alex sb ('is', 333, 222)

我們給f3()傳遞了多個引數,但是系統並沒有報錯,而且正常接受了引數,可見使用*args,**kwargs能夠接收多個引數,並且不同的函式即便函式的引數的個數不一致也沒有關係。

裝飾器就是為了給已經存在的函式擴充套件新的功能。

day4 函式的包裝 裝飾器 迭代器

1.函式巢狀 在呼叫乙個函式的過程中,由呼叫了其他函式 列子 def father name print from father s name def son print from son def grandson print from grandson grandson son father ni...

day4 遞迴原理及解析

遞迴 遞迴是一種呼叫自身的方法,在函式執行過程中重複不斷的呼叫自身的過程,遞迴的規模每次都要縮小,一般前一步的程式作為後一步的引數。但是必須有遞迴結束條件。遞迴演算法是一種直接或者間接地呼叫自身演算法的過程。在計算機編寫程式中,遞迴演算法對解決一大類問題十分有效,它往往是演算法的描述簡潔而且易於理解...

湖南集訓Day4

上午的數論感覺還可以,嗯,感覺。因為畢竟我數學弱,只聽懂一半什麼的,感覺證明還是比較顯然的。話說這金牌爺長得好像我某物理老師啊 下午的題終於不是clj出的了,沒辣麼虐了。第一題疑似回文自動機,然而並不會,於是dp水了60分。第二題想了下應該是樹鏈剖分,然後發現搞不出來,回去水第一題,然後水完回來繼續...