一文搞懂 Python 中的類方法
點擊上方“AI算法與圖像處理”,選擇加"星標"或“置頂”
重磅干貨,第一時間送達
引言

在上圖中可以看到一堆不同的時鐘。它們有不同的形狀、顏色和大小。然而,它們都是時鐘。我們可以用類似的方式來考慮Python中的類。一個類表示一個類型(時鐘) ,我們可以創(chuàng)建該類型的許多實例(不同的時鐘)。
面向?qū)ο缶幊?OOP)范例是圍繞擁有屬于特定類型的對象的思想構建的。在某種意義上,類型就是解釋我們?yōu)槭裁词菍ο蟮脑颉?/span>
對象的解釋對于 OOP 至關重要。我們需要全面地理解:
構成對象解釋的所有這些點都是用類定義的。Python中的所有內(nèi)容都是一個類型的對象,例如整數(shù),列表,字典,函數(shù)等。我們使用類定義對象的類型。
在本文中,我們將探討類的含義,如何在Python中創(chuàng)建和使用類以及通過使用類可以獲得哪些優(yōu)勢。
Python中的類是什么?
類具有以下信息:
我們一直在使用Python中的類。例如,當我們創(chuàng)建一個列表時,我們將創(chuàng)建一個類型為list的實例。
words = ['data', 'science', 'machine', 'learning']我們實際上對列表類的創(chuàng)建方式不感興趣。我們只需要知道如何與列表交互并在我們的代碼中有效地使用它們即可。這就是抽象的概念。
例如,我們可以使用remove方法從列表中刪除一個項目。
words.remove('data')print(words)['science', 'machine', 'learning']
創(chuàng)建一個類
下面的代碼創(chuàng)建一個名為Book的類。
class Book():def __init__(self, name, writer, word_length):self.name = nameself.writer = writerself.word_length = word_length
__init__是一個特殊的函數(shù),當創(chuàng)建類的實例時,該函數(shù)會自動執(zhí)行。它也稱為類構造函數(shù)。
init函數(shù)的參數(shù)表示類的數(shù)據(jù)屬性。因此,如果需要為name,writer和length參數(shù)指定參數(shù)以創(chuàng)建Book實例。
注意:self是指實例本身??梢允褂萌魏螁卧~代替“self”,但是使用“self”是一種非常普遍的做法。
讓我們創(chuàng)建一個實例。
b1 = Book("Pandas", "John Doe", 100000)print(type(b1))'__main__.Book' >
b1是屬于Book類的對象。我們可以使用返回對象類型的類型函數(shù)進行確認。
我們可以使用以下方法訪問或修改類的屬性。
print(b1.name)Pandasb1.name = 'NumPy' #updates the name attributeprint(b1.name)NumPy
定義類方法
Book類僅具有數(shù)據(jù)屬性。我們應該添加方法(即過程屬性),使其具有實用性和功能性。
例如,我們可以實現(xiàn)一種方法,該方法返回給定fontsize的頁數(shù)。我們用字數(shù)指定書的長度。該方法將根據(jù)長度和字體大小計算頁面數(shù)。
def number_of_pages(self, fontsize=12):word_length = self.word_lengthif fontsize == 12:words_in_page = 300else:words_in_page = 300 - (fontsize - 12) * 10return round(word_length / words_in_page)
我們在類定義中添加number_of_pages。它根據(jù)單詞數(shù)和字體大小計算一本書的頁數(shù)。
如果我們在類定義中聲明的函數(shù)需要訪問實例的數(shù)據(jù)屬性,則需要告訴該函數(shù)如何訪問它們。這是我們在number_of_pages函數(shù)的第一行中所做的。
我們可以從類或?qū)嵗L問方法。
b1 = Book("Pandas", "John Doe", 100000)b1.number_of_pages()333Book.number_of_pages(b1)333
number_of_pages函數(shù)具有一個附加的fontsize參數(shù)。由于指定了默認值(12),因此我們不必顯式編寫它。但是,我們可以為fontsize參數(shù)使用不同的值。
b1.number_of_pages(14)357b1.number_of_pages(fontsize=16)385
隨著字體大小的增加,頁面數(shù)量也會增加。
為了使用Python的某些內(nèi)置函數(shù),我們需要為類定義某些方法。考慮打印功能。
print(b1)<__main__.Book object at 0x7fa4cf9f7588>
默認情況下,打印功能返回對象的類型和存儲位置。但是,我們可以通過在類中實現(xiàn)__str__方法來自定義其行為。
def __str__(self):return "<" + self.name + ", by " + self.writer + ">"
如上所述,我們在類定義中添加了_str_方法。以下是print函數(shù)現(xiàn)在在我們的類中的工作原理:
print(b1)
類與實例變量
類變量在類內(nèi)部但在任何函數(shù)外部聲明。實例變量是在__init__方法的構造函數(shù)中聲明的。
類變量更為通用,可能會應用類的所有實例。另一方面,實例變量更為具體,并分別為每個實例定義。在類變量和實例變量之間進行區(qū)分非常有用。
考慮我們之前定義的Book類。我們經(jīng)營一家出版公司,并為我們出版的書籍制定了一些標準,例如封面的頁面寬度和顏色。如果將它們定義為類變量,則不必為創(chuàng)建的每個實例顯式聲明。
class Book():page_width = 14cover_color = "blue"def __init__(self, name, writer, word_length):self.name = nameself.writer = writerself.word_length = word_length
我們已將page_width和cover_color實現(xiàn)為類變量,因為它們位于類定義之內(nèi),但不在任何函數(shù)定義之內(nèi)。
讓我們創(chuàng)建 Book 類的一個實例。
b2 = Book("Machine Learning", "Jane Doe", 120000)在創(chuàng)建此實例時,我們沒有指定類變量。然而,b2擁有這些變量,我們可以訪問它們。
b2.page_width14b2.cover_color'blue'
我們可以選擇更改特定實例的類變量。
b2.cover_color = 'red'b2.cover_color'red'
對特定實例的更改不會對類變量產(chǎn)生任何影響。
Book.cover_color'blue'
創(chuàng)建一個子類
我們可以基于不同的類創(chuàng)建一個類。讓我們基于“ Book”類創(chuàng)建一個名為“ ColorBook”的類。
class ColorBook(Book):ColorBook是Book類的子類。當我們以這種方式創(chuàng)建一個類時,子類從父類復制屬性(數(shù)據(jù)和過程)。這個概念稱為繼承,它使OOP更加有效和強大。
它與現(xiàn)實生活中的遺傳類似。我們的基因組大部分來自我們的父母或祖先。我們從他們那里繼承。因此,我們和我們的父母有相似之處。
除了從父類繼承的屬性之外,子類還可以有新的屬性。此外,我們還可以選擇修改或覆蓋繼承的屬性。
讓我們定義ColorBook類的__init__函數(shù)。它將具有兩個附加參數(shù),分別是“ color”(顏色)指示頁面的顏色和“ has_image”(指示書中是否有圖像)。
class ColorBook(Book):def __init__(self, name, writer, word_length, color, has_image):Book.__init__(self, name, writer, word_lengthself.color = colorself.has_image = has_image
由于name,writer和word_length已在Book類中定義,因此我們可以從中復制__init__方法。我們只需要定義其他屬性。
注意:我們可以自由為子類手動定義每個數(shù)據(jù)屬性。使用父節(jié)點的__init__是可選的。
讓我們創(chuàng)建一個ColorBook類的實例。
c1 = ColorBook("Seaborn", "John Doe", 90000, "green", True)c1.name"Seaborn"c1.color"green"
子類也繼承類變量。
c1.cover_color"blue"c1.page_width14
這些方法也是從父類復制的。對于Book類,我們定義了兩個方法,它們也可以用于ColorBook類的實例。
c1.number_of_pages()300print(c1)
我們可以選擇覆蓋從父類繼承的數(shù)據(jù)和過程屬性(即方法)。這使繼承更加強大,因為我們必須使用父類中的所有內(nèi)容。
例如,我們可以為ColorBook類修改__str__方法。
def __str__(self):return "<" + self.name + ", in " + self.color + ">"
Print函數(shù)將返回書的名稱和顏色。
c1 = ColorBook("Seaborn", "John Doe", 90000, "green", True)print(c1)in green>
下面是Book和ColorBook類的類定義。


總結
我們在本文中討論的內(nèi)容可以被認為是對 Python 類的全面介紹。我們已經(jīng)提到了類對于面向?qū)ο缶幊痰闹匾?,以及類如何演示抽象和繼承等關鍵概念。
在實際應用方面,我們已經(jīng)定義了兩個類,并且看到了在創(chuàng)建子類時繼承是如何工作的。
還有很多關于 Python 類的內(nèi)容。一旦你熟悉了這些基礎知識,就可以自由地進入更高級的話題。
個人微信(如果沒有備注不拉群!) 請注明:地區(qū)+學校/企業(yè)+研究方向+昵稱
下載1:何愷明頂會分享
在「AI算法與圖像處理」公眾號后臺回復:何愷明,即可下載。總共有6份PDF,涉及 ResNet、Mask RCNN等經(jīng)典工作的總結分析
下載2:終身受益的編程指南:Google編程風格指南
在「AI算法與圖像處理」公眾號后臺回復:c++,即可下載。歷經(jīng)十年考驗,最權威的編程規(guī)范!
下載3 CVPR2020 在「AI算法與圖像處理」公眾號后臺回復:CVPR2020,即可下載1467篇CVPR?2020論文
覺得不錯就點亮在看吧


