面向對象的編程(Object-Oriented Programming ,OOP),每當看到這個術語,我們就會把它與JAVA聯系起來。
事實上,Java普及了面向對象的編程風格,除了Java之外,還有很多OOP語言,例如,C++、C#、Swift、JavaScript、php等,當然,也包括Python。
Python提供了一種面向對象的編程風格,今天,我就來循序漸進的講解一下Python面向對象,保證哪怕是零基礎小白在看完這篇文章后也能夠徹底搞明白Python面向對象。
在本文中,我將從如下幾個主題給大家介紹Python面向對象編程的基礎知識:
- 類
- 對象
- 繼承
- 屬性
- 方法
1 基本概念
1.1 類
什么是OOP中的類?
首先,借助一張圖片來理解這個概念。
從上面圖片,我們可以看到如下信息:類、對象、屬性、方法和一只皮卡丘。
這與OOP有什么關系?
好吧,上面的圖片正是幫助我們理解OOP概念的東西。
所以,現在進入第一個話題。
OOP中的類是什么意思?類的定義是 "類是同一類型的對象的集合"。
把這個定義與上面的例子聯系起來。
在這幅圖中,我們可以看到有一個名為 小精靈(Pokemon)的矩形框,這就是類的名稱。
因此,簡而言之,類只不過是一個對象的集合。因此,在pokemon宇宙中的所有pokemon都在 "pokemon"類下。
?
為了確保理解,再講一個示例。
以我們經常會見到的汽車為例,日產、特斯拉、福特、豐田,這些可以理解為一個個的對象,而“汽車”則是這一系列對象的合成、集合。
1.2 對象
前面已經反復的提到對象這個概念,接下來再具體的解釋一下。
在OOP中,對象是一個類的組成部分或成員。考慮到我們的小精靈例子,每個小精靈都是小精靈類的一個對象。比如說。皮卡丘是口袋妖怪類的一個對象。比如說,豐田就是汽車的一個對象。
1.3 屬性
回到我們的Pokemon例子,讓我們專注于圖像中的皮卡丘。觀察它一會兒。你看到了什么?
通過觀察皮卡丘的圖像,我們可以看到它有兩只耳朵,兩只手,兩條腿,臉頰上有兩個紅色的小圓點,還有一個顯著的黃色。
在圖片中的鄰接表格中,我們還看到了一些東西,例如,名稱="皮卡丘",類型="電動"和健康狀況=70。
因此,所有這些都被稱為屬性,屬性是提供關于類或對象的額外信息的元素。
在這種情況下,所有這些屬性都提供了關于皮卡丘對象的額外信息,如顏色、健康狀況等。
1.4 方法
在Pokemon示例中,在圖表中可以看到諸如attack(), dodge(), evolve()這些東西,這就是所謂的方法。
更簡單地解釋,方法基是與某個特定對象相關的動作。
在這種情況下,這些動作與我們的皮卡丘對象有關。
到此為止,想必很多同學對面向對象中的一些概念有了基本的了解。
下面,就實踐起來,看一下Python面向對象到底該怎么用。
2 實踐
2.1 創建類
class Pokemon():
正如你從上面的代碼中所看到的,在Python中創建一個類時,需要遵循一定的結構。
以關鍵字class開頭,通過這種方式,Python可以識別出我們要創建的東西將被視為一個類。
關鍵字class之后是類的名稱,在本例中是 Pokemon。
最后,它的后面是(),然后是:字符。
當然,到這里類還沒有創建好,還需要一些其他的內容。
創建__init__方法
繼續我們的類的創建任務,下一步涉及到創建一個非常特殊的方法,名為__init__。
你可能會問:這個__init__方法是什么?
為了簡單理解這個概念,可以認為init方法類似于Java中的構造方法。
我之前專門寫過一篇文章進行介紹,想深入了解的可以看一下:
先給出具體代碼:
class Pokemon():
def __init__():
從上面代碼可以看到,已經在Python中創建了__init__方法。
在這里,我們注意到一件事,那就是名為def的關鍵字,在Python中主要用于創建函數或者方法使用。
添加屬性
目前已經定義了__init__( )方法,但是,它仍然沒有被完全定義。仍然需要在__init__( )方法中傳遞某些參數來完成它的定義。
接下來,讓給__init__( )方法中添加這些參數。
class Pokemon():
def __init__(self,name,Type,health):
self.name = name
self.Type = Type
self.health = health
從上面代碼可以看到,我在__init__( )方法中傳遞了很多參數。現在讓我們回過頭來了解一下這里傳遞的是什么參數。
還記得前面介紹的概念吧?我們討論過皮卡丘是黃色的,臉頰上有兩個紅點,等等。這些是與一個對象相關的屬性,在這個__init__ ( )方法中,我們定義這些屬性。
除此之外,再解釋一下另外一個問題:self的用途是什么?
簡單地解釋一下,self是一個關鍵字,負責將這些屬性連接到我們的類,也就是本例中的Pokemon。
2.2 創建方法
到此為止,我們已經聲明了我們的類,名為__init__()的特殊方法和類的屬性。
接下來,繼續進行最后的部分,即方法的創建。
class Pokemon():
def __init__(self,name,Type,health):
self.name = name
self.Type = Type
self.health = health
def attack(self):
print("Electric attack!")
def dodge(self):
print("Pikachu Dodge!")
def evolve(self):
print("Evolving to Raichu!")
正如你可以從上面的代碼中看到的,我創建3個名為attack()、dodge()、evolve()的方法。
觀察這段代碼,你可以看到我們為每個方法都傳遞了一個名為self的參數。在這里,正在使用self關鍵字將這個方法與我們的類連接起來。
到此為止,就創建了一個完整的類。
2.3 創建對象
首先,給出創建對象的代碼,在這里我創建了一個名為pk1的對象:
pk1 = Pokemon("Pikachu","Electric",120)
創建完對象之后,我們就可以做很多操作。
訪問屬性
我們可以通過<對象名>.<屬性>的方法來訪問對象的屬性,來看一下具體的代碼:
pk1.name # 輸出:Pikachu
pk1.Type # 輸出:Electric
pk1.health # 輸出:120
訪問方法
訪問方法和訪問屬性類型<對象名>.<方法>,同樣,用具體代碼來更加清晰的解釋一下:
pk1.attack() # 輸出:Electric attack!
pk1.dodge() # 輸出:Pikachu Dodge!
pk1.evolve() # 輸出:Evolving to Raichu!
到這里,就講解完了Python面向對象編程的基本內容。
下面,就再進階一下,介紹一下面向對象編程中的繼承。
2.4 繼承
繼承是OOP中的關鍵概念之一,同樣,借助一個簡單的例子來更加輕松理解這個概念。
?
考慮一個超級跑車的例子,邁凱輪 720S spyder,這是一輛超級跑車。
正如你所看到的,像大多數其他汽車一樣,它有一些共同的特征,如門,擋風玻璃,4個輪子,頭燈,尾燈,等等。
然而,由于它是一輛超級跑車,它有自己的定制特征,如720馬力的V8渦輪增壓發動機,由邁凱輪開發的定制變速箱,以及定制的AWD(全輪驅動)系統。
現在將其與面向對象的術語聯系起來,我們可以說這輛車是從它的父類中繼承了某種特征,在這種情況下,它首先是一個汽車類。
這就是 "繼承"背后的概念。
繼承是一種現象,一個元素從它的父類中獲得特征。在這種情況下,邁凱輪720S spyder繼承了汽車類的所有共同特征,但與此同時,它本身也有某些特殊的特征。
超類和子類
我們的元素所繼承的類(本例中的汽車類)被稱為超類(Superclass),它具有通用性。
而繼承這些特征的類被稱為子類(Subclass),它在本質上是特殊的。
接下來,在 Python 中實現這些概念。
在這個例子中,我將創建兩個類--一個是名為Car的類,它就是超類。另一個是名為McLaren的類,它是子類。這個McLaren類將繼承Car類的所有屬性。
class Car():
def __init__(self,ndoors,nwheels,tailLight,headLight):
self.ndoors = ndoors
self.nwheels = nwheels
self.tailLight = tailLight
self.headLight = headLight
在這里,已經創建了第一個名為Car的類。
現在,我們將創建一個名為McLaren的新類,它將繼承這個類的所有屬性。
class McLaren(Car):
def __init__(self,ndoors,nWheels,tailLight,headLight,Engine,Wheel_Drive):
Car.__init__(self,ndoors,nWheels,tailLight,headLight)
self.Engine = Engine
self.Wheel_Drive = Wheel_Drive
def Drive(self):
print("I am driving McLaren 720S Spyder")
正如你在上面的代碼中看到的,由于McLaren類繼承了Car類,我們在創建McLaren類時把Car作為參數之一,這是Python類繼承一種機制。
下面,我們創建一個McLaren的對象,驗證一下它是否繼承了Car特征。
mk1 = McLaren("4","4","Yes","Yes","V8","AWD")
然后,再訪問一下對象的屬性:
mk1.Engine # 輸出:V8
mk1.Wheel_Drive # 輸出:AWD
在這里我們可以看到,我們能夠訪問McLaren對象中專門定義的特殊屬性,這些屬性在基類Car中是沒有的。
在這里我們繼承了我們的基類,讓我們看看基類中的那些屬性是否在我們的McLaren類中被繼承了。
mk1.headLight # 輸出:YES
mk1.ndoors # 輸出:4
mk1.nWheels # 輸出:4
可以看到,新創建的McLaren類的對象繼承了Car基類的所有特征,表明在這個上下文中,繼承被正確地實現了。
到此為止,從基本概念到實踐,涵蓋 Python中類、對象、特殊方法、屬性、方法等概念和具體實現,已經全面的介紹了Python面相對象中的相關知識和內容,是不是已經徹底了解Python面相對象了?