您好,登錄后才能下訂單哦!
這篇文章主要介紹“適合初學者的Python裝飾器的方法教程”,在日常操作中,相信很多人在適合初學者的Python裝飾器的方法教程問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”適合初學者的Python裝飾器的方法教程”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
裝飾器是Python編程語言中相當高級的一部分。就像大多數事情一樣,一旦你掌握了它們的工作原理并使用了幾次,它們就會變得非常簡單明了,但是作為一個初學者,它們可能會有點讓人望而生畏,很難理解。只有理解了它所解決的問題,你才能真正理解它。例如,我可以直接聲明裝飾器的定義:
decorator是一個函數,它將另一個函數作為參數并返回它的修改版本,以某種方式增強了它的功能。 |
如果您已經了解了decorator是什么,那么這個定義就非常清楚了,但是如果您不了解,那么可能就不太了解了。重要的是,這個定義本身并不能告訴您什么時候使用修飾符,或者沒有修飾符Python會變得多么糟糕。
舉例
我們將從一個假設的場景開始,并觀察如果不使用decorator可能出現的問題。在你上班的第一天,你的老板找到你,讓你寫一個函數,這個函數將一個字符串轉換成一個回文:一個向前和向后讀取相同內容的字符串。
你可以這樣寫:
def make_palindrome(string): """Makes a palindromic mirror of a string.""" return string + string[::-1]
到目前為止一切順利。一小時后,老板要求更多的函數:一個credits函數在任何字符串的末尾添加一個字符串,一個函數將字符串轉換到另一個字符串中,還有一個函數在字符串中插入逗號。
你開始加入新的函數:
def add_credits(string): """Adds the company's credits to the end of any string.""" return f"{string} (string created by Pro String Inc.)" def snake_to_camel(string): """Converts a string in snake_case to camelCase.""" words = string.split("_") if len(words) > 1: words = [words[0]] + [word.title() for word in words[1:]] return "".join(words) def insert_commas(string, spacing=3): """Inserts commas between every n characters.""" sections = [string[i: i + spacing] for i in range(0, len(string), spacing)] return ",".join(sections)
但問題出現了。老板看你的代碼,并提醒你函數必須能夠接受整數作為輸入,并且它們應該被轉換成字符串。他建議在每個函數的開頭加上一行,檢查輸入是否為整數,如果是整數則進行轉換。
這會讓你士氣低落——你必須把每個功能都檢查一遍,然后在開始的時候加上一些類似這樣的東西:
if isinstance(string, int): strstring = str(string)
當我們有四個需要修改的函數時,這是可以的,但是如果我們有十個呢?讓所有的功能都以相同的兩行開始違背了神圣的“不要重復自己”的法律準則。
難道沒有一種方法可以只修改所有這些函數而不添加額外代碼嗎?要了解如何做到這一點,讓我們回過頭來看看Python函數。盡管Python函數有特殊的語法,但它只是一個對象,就像字符串或列表一樣。您可以檢查它們的屬性,將它們分配給新的變量,并且——至關重要的是——將它們作為參數傳遞給另一個函數。
例如,您可以使一個函數接受另一個函數,并檢查它是否有任何關鍵字參數:
def func_has_kwargs(func): return len(func.__defaults__) > 0
不要擔心__defaults__如果你還沒見過,這里的關鍵是,函數是另一個函數作為參數,檢查是否有任何關鍵字參數(即如果__default__產權的長度大于0),否則,返回True,如果是這樣,則返回False。
現在回到我們的問題之中。我們有三個精心設計的字符串操作函數,我們需要修改它們,使它們也接受整數。我們需要的是一個新函數——它將把我們現有的函數作為輸入,并創建一個修改后的函數來檢查整數。我們需要一個裝飾函數:
讓我們仔細看看這里發生了什么。accept_integers是我們的裝飾函數——它接受一個函數作為輸入,返回另一個函數作為輸出。在它的主體中,它創建了一個新函數,該函數應該完成輸入函數所做的所有事情,但是在開始時需要一個額外的步驟。如果您查看這個函數的主體,您可以看到它檢查給定的字符串是否為整數,如果是整數則轉換它,然后將這個字符串傳遞給原始函數。這里缺少一個步驟——我們需要實際使用這個裝飾器:
標準形式
最后,值得指出的是,雖然上面的語法是完全有效的,但是Python以@符號的形式提供了快捷方式。可以將@accept_integers添加到任何函數的前面來修飾它:
這是將一個函數傳遞給另一個函數的另一種方式。在底層,當Python看到@符號時,它會為您執行decorator的調用。許多Python庫都提供裝飾器,以快速增強編寫的函數,而不必輸入大量重復的代碼。
到此,關于“適合初學者的Python裝飾器的方法教程”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。