繼承的格式如下
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 |
參考資料
http://docs.python.org/py3k/tutorial/classes.html
http://docs.python.org/py3k/reference/compound_stmts.html
http://docs.python.org/py3k/tutorial/classes.html
http://docs.python.org/py3k/reference/compound_stmts.html
沒有留言:
張貼留言