自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

適合初學者的Python裝飾器的簡易教程

開發(fā) 后端
如果您已經(jīng)了解了decorator是什么,那么這個定義就非常清楚了,但是如果您不了解,那么可能就不太了解了。重要的是,這個定義本身并不能告訴您什么時候使用修飾符,或者沒有修飾符Python會變得多么糟糕。

裝飾器是Python編程語言中相當高級的一部分。就像大多數(shù)事情一樣,一旦你掌握了它們的工作原理并使用了幾次,它們就會變得非常簡單明了,但是作為一個初學者,它們可能會有點讓人望而生畏,很難理解。只有理解了它所解決的問題,你才能真正理解它。例如,我可以直接聲明裝飾器的定義:

decorator是一個函數(shù),它將另一個函數(shù)作為參數(shù)并返回它的修改版本,以某種方式增強了它的功能。

如果您已經(jīng)了解了decorator是什么,那么這個定義就非常清楚了,但是如果您不了解,那么可能就不太了解了。重要的是,這個定義本身并不能告訴您什么時候使用修飾符,或者沒有修飾符Python會變得多么糟糕。

適合初學者的Python裝飾器的簡易教程

舉例

我們將從一個假設的場景開始,并觀察如果不使用decorator可能出現(xiàn)的問題。在你上班的第一天,你的老板找到你,讓你寫一個函數(shù),這個函數(shù)將一個字符串轉換成一個回文:一個向前和向后讀取相同內(nèi)容的字符串。

你可以這樣寫:

  1. def make_palindrome(string): 
  2.   """Makes a palindromic mirror of a string.""" 
  3.    
  4.     return string + string[::-1] 

到目前為止一切順利。一小時后,老板要求更多的函數(shù):一個credits函數(shù)在任何字符串的末尾添加一個字符串,一個函數(shù)將字符串轉換到另一個字符串中,還有一個函數(shù)在字符串中插入逗號。

你開始加入新的函數(shù):

  1. def add_credits(string): 
  2.     """Adds the company's credits to the end of any string.""" 
  3.    
  4.     return f"{string} (string created by Pro String Inc.)" 
  5.  
  6.    
  7. def snake_to_camel(string): 
  8.     """Converts a string in snake_case to camelCase.""" 
  9.    
  10.     words = string.split("_") 
  11.     if len(words) > 1: 
  12.           words = [words[0]] + [word.title() for word in words[1:]] 
  13.     return "".join(words) 
  14.    
  15.    
  16. def insert_commas(string, spacing=3): 
  17.   """Inserts commas between every n characters.""" 
  18.    
  19.   sections = [string[i: i + spacing] for i in range(0, len(string), spacing)] 
  20.   return ",".join(sections) 

但問題出現(xiàn)了。老板看你的代碼,并提醒你函數(shù)必須能夠接受整數(shù)作為輸入,并且它們應該被轉換成字符串。他建議在每個函數(shù)的開頭加上一行,檢查輸入是否為整數(shù),如果是整數(shù)則進行轉換。

這會讓你士氣低落——你必須把每個功能都檢查一遍,然后在開始的時候加上一些類似這樣的東西:

  1. if isinstance(string, int):    strstring = str(string) 

當我們有四個需要修改的函數(shù)時,這是可以的,但是如果我們有十個呢?讓所有的功能都以相同的兩行開始違背了神圣的“不要重復自己”的法律準則。

難道沒有一種方法可以只修改所有這些函數(shù)而不添加額外代碼嗎?要了解如何做到這一點,讓我們回過頭來看看Python函數(shù)。盡管Python函數(shù)有特殊的語法,但它只是一個對象,就像字符串或列表一樣。您可以檢查它們的屬性,將它們分配給新的變量,并且——至關重要的是——將它們作為參數(shù)傳遞給另一個函數(shù)。

例如,您可以使一個函數(shù)接受另一個函數(shù),并檢查它是否有任何關鍵字參數(shù):

  1. def func_has_kwargs(func):    return len(func.__defaults__) > 0 

不要擔心__defaults__如果你還沒見過,這里的關鍵是,函數(shù)是另一個函數(shù)作為參數(shù),檢查是否有任何關鍵字參數(shù)(即如果__default__產(chǎn)權的長度大于0),否則,返回True,如果是這樣,則返回False。

現(xiàn)在回到我們的問題之中。我們有三個精心設計的字符串操作函數(shù),我們需要修改它們,使它們也接受整數(shù)。我們需要的是一個新函數(shù)——它將把我們現(xiàn)有的函數(shù)作為輸入,并創(chuàng)建一個修改后的函數(shù)來檢查整數(shù)。我們需要一個裝飾函數(shù):

適合初學者的Python裝飾器的簡易教程

讓我們仔細看看這里發(fā)生了什么。accept_integers是我們的裝飾函數(shù)——它接受一個函數(shù)作為輸入,返回另一個函數(shù)作為輸出。在它的主體中,它創(chuàng)建了一個新函數(shù),該函數(shù)應該完成輸入函數(shù)所做的所有事情,但是在開始時需要一個額外的步驟。如果您查看這個函數(shù)的主體,您可以看到它檢查給定的字符串是否為整數(shù),如果是整數(shù)則轉換它,然后將這個字符串傳遞給原始函數(shù)。這里缺少一個步驟——我們需要實際使用這個裝飾器:

適合初學者的Python裝飾器的簡易教程

標準形式

最后,值得指出的是,雖然上面的語法是完全有效的,但是Python以@符號的形式提供了快捷方式。可以將@accept_integers添加到任何函數(shù)的前面來修飾它:

適合初學者的Python裝飾器的簡易教程

這是將一個函數(shù)傳遞給另一個函數(shù)的另一種方式。在底層,當Python看到@符號時,它會為您執(zhí)行decorator的調(diào)用。許多Python庫都提供裝飾器,以快速增強編寫的函數(shù),而不必輸入大量重復的代碼。

我們對裝飾師和所有新編程特性的建議是,首先要學會識別使用該特性的情況——它能解決的問題,以及不使用它所帶來的痛苦——然后再學習它是如何工作的。像往常一樣,真正理解的唯一方法,就是自己編寫一個。所以去做吧​,后浪們。

 

責任編輯:趙寧寧 來源: 今日頭條
相關推薦

2018-02-23 10:03:30

Linux命令mkdir

2010-06-13 11:13:38

UML初學者指南

2020-03-01 14:57:47

Python編程函數(shù)

2021-02-04 14:54:22

Python開發(fā)語言

2021-12-09 05:58:51

編程語言開發(fā)代碼

2011-03-10 09:17:25

軟件編程

2021-03-24 14:46:52

Python工具代碼

2024-03-06 09:31:34

SQL數(shù)據(jù)庫數(shù)據(jù)結構

2021-01-12 10:06:57

編程語言開發(fā)

2018-04-08 14:47:06

Linux命令type

2018-04-24 11:09:13

LinuxShellfc

2018-05-14 08:53:51

Linux命令shuf

2019-07-25 13:12:26

Linux發(fā)行版

2009-12-02 10:01:54

2009-11-23 10:29:43

CISCO路由器教程

2011-04-07 14:09:45

2011-08-16 14:14:22

MySQL數(shù)據(jù)庫初學者

2011-08-16 13:59:42

MySQL初學者表的操作

2017-12-26 14:52:39

軟件定義數(shù)據(jù)中心SDDC架構
點贊
收藏

51CTO技術棧公眾號