在昨天文章最後,有提到一點點覆寫的功能,所以這邊也一起正式說明:
繼承時,若子類別也定義了跟父類別相同的方法名,提供不同的功能,稱為「覆寫(override)」;而不同類別,呼叫同名的方法時會去執行不同方法實作,則屬於「多型(polymorphism)」的表現形式。下方例子能稍微理解一下:
class Animal():
def shout(self):
print('Animal shout')
class Dog(Animal):
def shout(self):
print('Dog shout')
class Cat(Animal):
def shout(self):
print('Cat shout')
d = Dog()
c = Cat()
d.shout()
c.shout()
-----------------------
Dog shout
Cat shout
如此可看出,Animal類別的shout()方法被覆寫掉了,所以最後在呼叫時,是根據子類別的shout()方法。那類別Dog跟Cat都有shout()方法,也就是介面相同,實作不同,因此在呼叫時,Python直譯器會根據實體類別來決定該執行哪一個方法實作,這樣就是多型的意思。
利用實際例子來更了解多型的涵義,以下是計算圓形、長方形、三角形面積的程式碼,它們都會有相同名稱的方法show_shape_info()、get_area()
,因此來試試多型的技術。
import math
class Circle: #圓形
def __init__(self,radius):
self.radius = radius
def show_shape_info(self): #資料
print('圓形半徑:'+str(self.radius))
def get_area(self): #計算
return math.pi * self.radius * self.radius
class Rectangle: #矩形
def __init__(self,length,width):
self.length = length
self.width = width
def show_shape_info(self):
print('矩形長:'+str(self.length)+'寬:'+str(self.width))
def get_area(self):
return self.length * self.width
class Triangle: #三角形
def __init__(self,bottom,height):
self.bottom = bottom
self.height = height
def show_shape_info(self):
print('三角形底:'+str(self.bottom)+'高:'+str(self.height))
def get_area(self):
return self.bottom * self.height / 2
c = Circle(10) #建立物件
r = Rectangle(8,5)
t = Triangle(10,2)
shapes = c,r,t #將物件加入元組
for i in shapes: #用for迴圈顯示每一個物件的內容和面積
i.show_shape_info()
print('面積:'+str(i.get_area()))
-----------------------------------------
圓形半徑:10
面積:314.1592653589793
矩形長:8寬:5
面積:40
三角形底:10高:2
面積:10.0
重點在於用for迴圈印出結果,我們對每一個物件呼叫show_shape_info()
和get_area()
方法,不用管到底是哪一個類別的,因為他們都有共同的方法,這樣就是多型的概念拉~