Python 3.1 快速導覽 - 類別 繼承

若定義了很多類別 (class) ,這些類別中又具有相當多相同的屬性 (attribute) 或方法 (method) 定義,這時候,可利用 Python 的繼承 (inheritance) 機制,將共通的屬性及方法提取出來,另行定義父類別 (superclass) ,然後將原本提出共通屬性及方法改為繼承 (inherit) 父類別的子類別 (subclass) 。



繼承的格式如下
class SubDemo(Demo):
    pass


這是從 SubDemo 類別去繼承 Demo ,注意類別名稱後的小括弧中註明父類別。


當然也可以換一個方向思考,直接以繼承的模式設計物件 (object) ,這是說,先設計具有共通屬性及方法的父類別,而後才針對物件特性另外設計子類別,因此所有共通的特性均來自父類別。其實 Python 的類別設計已經這樣子做,所有的類別繼承自 object 這個類別,因此以下寫法
class Demo:
    pass


等於
class Demo(object):
    pass


以下程式示範繼承的運用
class Demo:
    __x = 0

    def __init__(self, i):
        self.__i = i
        Demo.__x += 1
    
    def __str__(self):
        return str(self.__i)
         
    def hello(self):
        print("hello", self.__i)
    
    @classmethod 
    def getX(cls):
        return cls.__x

class SubDemo(Demo):
    pass


a = SubDemo(1234)
a.hello()
print(a.getX())
b = SubDemo(5678)
b.hello()
print(b.getX())
c = SubDemo(9012)
c.hello()
print(c.getX())
d = SubDemo(3456)
d.hello()
print(b.getX())
e = SubDemo(7890)
e.hello()
print(c.getX())

# 《程式語言教學誌》的範例程式
# http://pydoing.blogspot.com/
# 檔名:cla17.py
# 功能:示範 Python 程式 
# 作者:張凱慶
# 時間:西元 2010 年 12 月 


執行結果如下



上例的子類別 SubDemo 裡只用了一個 pass 陳述 (statement) ,這會使 SubDemo 的內容與父類別 Demo 完全一樣。


「繼承」是程式語言社群習慣用詞,英文動詞原文為 inherit ,意思泛指從什麼得到什麼,所以生物學中的「遺傳」也是用這個詞。實際上物件導向程式設計的繼承機制相當複雜,然而中文的繼承常用於某物不再,另物將起的意思,譬如我繼承某某的精神,雖然某某不見得已死,可是將來要付出努力的卻是我而非某某,因而這裡的意思中文用「遺傳」比較恰當,子代會從親代遺傳性狀,子代與親代也會並存一段時間,這就沒有某物不再的意含了。


內建函數 (function) isinstance() 可以判斷某一個物件是否為某一個類別所建構的實體 (instance) ,若真則回傳 True ,否則回傳 False 。另一個內建函數 issubclass() 則可以判斷某一個類別是否為另一個類別的子類別,同樣的,若真則回傳 True ,否則回傳 False


以下程式示範 isinstance() 與 issubclass() 的使用
class Demo:
    __x = 0

    def __init__(self, i):
        self.__i = i
        Demo.__x += 1
    
    def __str__(self):
        return str(self.__i)
         
    def hello(self):
        print("hello", self.__i)
    
    @classmethod 
    def getX(cls):
        return cls.__x

class SubDemo(Demo):
    pass


a = Demo(1234)
a.hello()
b = SubDemo(5678)
b.hello()
print(isinstance(a, Demo))
print(isinstance(a, SubDemo))
print(isinstance(b, Demo))
print(isinstance(b, SubDemo))
print(issubclass(SubDemo, Demo))
print(issubclass(Demo, SubDemo))

# 《程式語言教學誌》的範例程式
# http://pydoing.blogspot.com/
# 檔名:cla18.py
# 功能:示範 Python 程式 
# 作者:張凱慶
# 時間:西元 2010 年 12 月 


執行結果如下



注意,變數 (variable) b 雖然是由 SubDemo 建立的,但是 b 也會是 Demo 的實體,這是由於物件實體的建構過程中,會先建立父類別的部份,因此也會建立屬於 b 的父類別物件實體,使 b 得以運用父類別的屬性及方法。


中英文術語對照
類別class
屬性attribute
方法method
繼承inheritance
父類別superclass
繼承inherit
子類別subclass
物件object
陳述statement
函數function
實體instance
變數variable






沒有留言: