繼承的格式如下
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
沒有留言:
張貼留言