終於來到python終極指南最終回啦!
許多人都聽說過,物件導向程式設計有三大特性:
類別的繼承,顧名思義,就是從爸媽那邊A,這邊就簡單的說吧,繼承就是以一個既有的類別,對那個類別進行擴充,變成一個新的類別,這個就叫繼承,原有的類別稱為父類別,以父類別為基礎做擴充跟改寫而成的新類別稱為子類別, 在擴充父類別時如果定義新的變數或是副程式,名稱跟原本父類別一樣的話,將以子類別的為主,這時候就會產生一個問題,若新增在子類別的變數需要再初始化函數時做操作,該怎麼辦呢?如果直接寫一個新的__init__
初始化副程式,就會取代掉原本父類別的初始化副程式了,當然可以直接重寫__init__
初始化副程式,可是當父類別太龐大時就會很麻煩,因有我們有個方便的解決方法,那就是super
,super
可以直接將父類別的初始化副程式保留下來,讓我們可以以這為基礎進行初始化副程式的改寫,這種方式不但繼承了類別的結構,連初始化的方式也一並繼承下來,可謂真正的物件導向繼承的特色阿,以下直接以程式碼示範
# 定義類別,此類別在本範例中當成父類別
class 類別名稱A:
變數A(屬性)
def __init__(self, 參數1, 參數...):
初始化副程式區塊...
def 副程式A(self, 參數...):
副程式(方法)區塊...
# 定義類別,此類別為子類別,以上面的類別最為父類別來繼承,以上面類別為基礎做擴充改寫
class 類別名稱B(類別名稱A):
# 新增一個屬性,變數B
變數B(屬性)
#定義初始化副程式,將使用super(),繼承父類別的初始化副程式
def __init__(self, 父類別原有的參數..., 子類別新增的參數...):
# super()可以直接將父類別的初始化副程式保留下來
# 下面這行可以視為保留父類別原有的初始化副程式程式區塊
super(類別名稱B, self).__init__(父類別原有的參數...)
# 以下是繼承後新增的程式碼
新增的初始化副程式區塊...
# 新增一個方法,副程式B
def 副程式B(self, 參數...):
副程式(方法)區塊...
範例
# 定義類別,此類別在本範例中當成父類別
class Car():
color = ""
brand = ""
def __init__(self, c, b):
self.color = c
self.brand = b
print("新車建構完成,"+self.milage(0))
def milage(self, km):
return "里程數為"+str(km)+"公里"
# 定義類別,此類別為子類別,以上面的類別最為父類別來繼承,以上面類別為基礎做擴充改寫
class Taxi(Car):
# 新增一個屬性,司機 driver
driver = ""
#定義初始化副程式,將使用super(),繼承父類別的初始化副程式
def __init__(self, c, b, d):
# super()可以直接將父類別的初始化副程式保留下來
# 下面這行可以視為保留父類別原有的初始化副程式程式區塊
super(Taxi, self).__init__(c, b)
# 以下是繼承後新增的程式碼
self.driver = d
# 新增一個方法,傳回牌照種類,副程式licensePlate
def licensePlate(self):
return "營業用牌照"
if __name__ == "__main__":
uber = Taxi("白", "保時捷", "韓總雞")
# 印出 新車建構完成,里程數為0公里
print(uber.milage(1000))
# 印出 里程數為1000公里
print(uber.driver)
# 印出 韓總雞
print(uber.licensePlate())
# 印出 營業用牌照
簡單來說,你不需要知道類別裡面是如何設計的,你只要會使用就好,就像一台手機,內部零件五花八門,但你不需要懂零件,只要會用就好,零件都被封裝起來一般,說到這裡,各位有沒有想過,類別裡的變數和副程式,有些是要給使用者拿來使用的對吧,但也有一些變數和副程式,可能是儲存某些不想被人更改的常數或公式,像是圓周率或一分鐘有幾秒等等,這種類別裡不想要被存取變數和副程式,就是需要被封裝起來的成員,稱為私有成員,作法很簡單,只要在變數或副程式的名稱前加上__
,該變數或副程式就會被封裝起來了,爾後在操作時,只要試圖存取被封裝的私有成員,都是不允許的,範例如下
class 類別名稱:
變數A(屬性)
#定義私有成員變數B
__變數B(屬性)
def 副程式A(self, 參數...):
副程式(方法)區塊...
#定義私有成員副程式B
def __副程式B(self, 參數...):
副程式(方法)區塊...
程式碼 圓面積計算器
class Area():
r = 0
# 定義私有成員__pi
__pi = 3.14
def __init__(self, r):
self.r = r
print("面積為" + str(self.__area()))
# 定義私有成員__area()
def __area(self):
return self.r ** 2 * self.__pi
if __name__ == "__main__":
o = Area(6)
#印出 面積為113.04
print(o.r)
#印出 6
print(o.__pi)
#私有成員,無法存取所以會報錯
意思就是呼叫同樣名稱的方法時,會得到不同的結果,就像以下範例 Thor、CaptainAmerica 和 StarLord 類別都同樣擁有cast
方法,但呼叫 Chris1.cast()、Chris2.cast()、Chris3.cast() 的時候,各自的執行都不同,python會根據呼叫的類別來決定要執行哪個副程式,這就是多型
class Thor():
def cast(self):
print("Chris Hemsworth")
class CaptainAmerica():
def cast(self):
print("Chris Evans")
class StarLord():
def cast(self):
print("Chris Pratt")
if __name__ == "__main__":
Chris1 = Thor()
Chris2 = CaptainAmerica()
Chris3 = StarLord()
Chris1.cast()
#印出 Chris Hemsworth
Chris2.cast()
#印出 Chris Evans
Chris3.cast()
#印出 Chris Pratt
以上就是連續12天的python教學,畢竟python是我們所要使用的工具語言,因此免不了要去熟悉,在這些教學中,我都是以淺顯易懂來當作編寫方向,因此可能在某些解釋不是那麼精確或仔細,還請各位多多見諒,但出發點都是也學會使用為主,明天開始將會介紹時間序列分析的流程,讓我們一起努力吧~~