iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 24
0

多型

在昨天文章最後,有提到一點點覆寫的功能,所以這邊也一起正式說明:

繼承時,若子類別也定義了跟父類別相同的方法名,提供不同的功能,稱為「覆寫(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()方法,不用管到底是哪一個類別的,因為他們都有共同的方法,這樣就是多型的概念拉~/images/emoticon/emoticon37.gif

參考資料

  • 書名-Python程式設計入門 /葉難-編著
  • 書名-輕鬆學Python3 /孫宏明-編著

上一篇
Day23-繼承
下一篇
Day25-檔案處理
系列文
Python 30天學習日誌30

尚未有邦友留言

立即登入留言