繼承
緊接著我們來談談繼承。
回頭來看看我們的貓,假設現在我們擴充了一些功能:
class Cat:
def __init__(self, name):
self.name = name
def run(self):
print(self.name, 'runs')
def jump(self):
print(self.name, 'jumps')
def shout(self):
print('Meow')
我們發現 Cat
類別的物件將會擁有跑及跳的能力,好了,這世界上可不只有貓這種動物,我們也想寫一個 Dog
類別:
class Dog:
def __init__(self, name):
self.name = name
def run(self):
print(self.name, 'runs')
def jump(self):
print(self.name, 'jumps')
def shout(self):
print('Bark')
看樣子沒有問題,簡單的很,而且跟 Cat
類別實在是太像了,除了叫聲不同而已,甚至用複製貼上大法可以加速我撰碼的速度呢!
噢,如果真的是這麼做的話就慘了,大量重複的代碼會造成管理上的困難,更何況我們連複製貼上都懶,世界上有千萬種動物,我們要怎麼搞定這麼多具有相似特性卻略有不同的類別呢?
很簡單!我們抽取出他們的共性,寫成一個 Animal
類別,再分別繼承他們就好拉!請看:
class Animal:
def __init__(self, name):
self.name = name
def run(self):
print(self.name, 'runs')
def jump(self):
print(self.name, 'jumps')
class Cat(Animal):
def shout(self):
print('Meow')
class Dog(Animal):
def shout(self):
print('Bark')
在類別名稱後面加入小括號與要繼承的類別(我們稱之為 父類別 或是 基礎類別 ),就可以繼承基礎類別的屬性和方法,然後我們可以為該類別(我們稱之為 子類別 或 衍生類別 )新增一些屬於自己的方法甚至是覆寫掉一些基礎類別的方法,透過此手法,我們能夠輕鬆創造出更多的類別。
我們來看看如何覆寫掉方法,假設今天我們創造了人類這種 Animal
,我們想要在建構方法裡面新增人類的身分證號碼:
class Human(Animal):
def __init__(self, name, id):
self.name = name
self.id = id
透過上面的方法,我們能夠以新定義的__init__
取代基礎類別的__init__
。
說到這裡,且讓我們停下來看一下 __init__
,這個方法大家千萬不要以為取哪個名字都行,原因是這樣的,我們的所有類別其實都繼承自 Python 中的 object
類別,那怕是像 Aninmal
類別看起來好像沒有繼承別人,但他的確是繼承了 object
,在這個最最基礎的類別中,__init__
早就定義過了,我們不過是在覆寫他而已。