當然,如果一種語言不支持繼承就,“類”就沒有什么意義。派生類的定義如下所示:
~~~
class DerivedClassName(BaseClassName):
.
.
.
~~~
命名?BaseClassName?(示例中的基類名)必須與派生類定義在一個作用域內。除了類,還可以用表達式,基類定義在另一個模塊中時這一點非常有用:
`class DerivedClassName(modname.BaseClassName):`
派生類定義的執行過程和基類是一樣的。構造派生類對象時,就記住了基類。這在解析屬性引用的時候尤其有用:如果在類中找不到請求調用的屬性,就搜索基類。如果基類是由別的類派生而來,這個規則會遞歸的應用上去。
派生類的實例化沒有什么特殊之處:?DerivedClassName()?(示列中的派生類)創建一個新的類實例。方法引用按如下規則解析:搜索對應的類屬性,必要時沿基類鏈逐級搜索,如果找到了函數對象這個方法引用就是合法的。
派生類可能會覆蓋其基類的方法。因為方法調用同一個對象中的其它方法時沒有特權,基類的方法調用同一個基類的方法時,可能實際上最終調用了派生類中的覆蓋方法。(對于 C++ 程序員來說,Python 中的所有方法本質上都是?虛?方法。)
派生類中的覆蓋方法可能是想要擴充而不是簡單的替代基類中的重名方法。有一個簡單的方法可以直接調用基類方法,只要調用:?BaseClassName.methodname(self,?arguments)。有時這對于客戶也很有用。(要注意只有?BaseClassName?在同一全局作用域定義或導入時才能這樣用。)
Python 有兩個用于繼承的函數:
* 函數?isinstance()?用于檢查實例類型:?isinstance(obj,?int)?只有在?obj.__class__?是?int?或其它從?int?繼承的類型
* 函數?issubclass()?用于檢查類繼承:?issubclass(bool,?int)?為?True,因為?bool?是 int 的子類。但是,?issubclass(unicode,?str)?是?False,因為?unicode?不是?str?的子類(它們只是共享一個通用祖先類?basestring?)。
### 9.5.1\. 多繼承
Python 同樣有限的支持多繼承形式。多繼承的類定義形如下例:
~~~
class DerivedClassName(Base1, Base2, Base3):
.
.
.
~~~
在大多數情況下,在最簡單的情況下,你能想到的搜索屬性從父類繼承的深度優先,左到右,而不是搜索兩次在同一個類層次結構中,其中有一個重疊。因此,如果在?DerivedClassName?(示例中的派生類)中沒有找到某個屬性,就會搜索?Base1,然后(遞歸的)搜索其基類,如果最終沒有找到,就搜索?Base2,以此類推。
實際上,super()?可以動態的改變解析順序。這個方式可見于其它的一些多繼承語言,類似 call-next-method,比單繼承語言中的 super 更強大 。
動態調整順序十分必要的,因為所有的多繼承會有一到多個菱形關系(指有至少一個祖先類可以從子類經由多個繼承路徑到達)。例如,所有的 new-style 類繼承自?object?,所以任意的多繼承總是會有多于一條繼承路徑到達?object?。
為了防止重復訪問基類,通過動態的線性化算法,每個類都按從左到右的順序特別指定了順序,每個祖先類只調用一次,這是單調的(意味著一個類被繼承時不會影響它祖先的次序)。總算可以通過這種方式使得設計一個可靠并且可擴展的多繼承類成為可能。進一步的內容請參見[http://www.python.org/download/releases/2.3/mro/](http://www.python.org/download/releases/2.3/mro/)?。
- Python 入門指南
- 1. 開胃菜
- 2. 使用 Python 解釋器
- 2.1. 調用 Python 解釋器
- 2.2. 解釋器及其環境
- 3. Python 簡介
- 3.1. 將 Python 當做計算器
- 3.2. 編程的第一步
- 4. 深入 Python 流程控制
- 4.1. if 語句
- 4.2. for 語句
- 4.3. range() 函數
- 4.4. break 和 continue 語句, 以及循環中的 else 子句
- 4.5. pass 語句
- 4.6. 定義函數
- 4.7. 深入 Python 函數定義
- 4.8. 插曲:編碼風格
- 5. 數據結構
- 5.1. 關于列表更多的內容
- 5.2. del 語句
- 5.3. 元組和序列
- 5.4. 集合
- 5.5. 字典
- 5.6. 循環技巧
- 5.7. 深入條件控制
- 5.8. 比較序列和其它類型
- 6. 模塊
- 6.1. 深入模塊
- 6.2. 標準模塊
- 6.3. dir() 函數
- 6.4. 包
- 7. 輸入和輸出
- 7.1. 格式化輸出
- 7.2. 文件讀寫
- 8. 錯誤和異常
- 8.1. 語法錯誤
- 8.2. 異常
- 8.3. 異常處理
- 8.4. 拋出異常
- 8.5. 用戶自定義異常
- 8.6. 定義清理行為
- 8.7. 預定義清理行為
- 9. 類
- 9.1. 術語相關
- 9.2. Python 作用域和命名空間
- 9.3. 初識類
- 9.4. 一些說明
- 9.5. 繼承
- 9.6. 私有變量
- 9.7. 補充
- 9.8. 異常也是類
- 9.9. 迭代器
- 9.10. 生成器
- 9.11. 生成器表達式
- 10. Python 標準庫概覽
- 10.1. 操作系統接口
- 10.2. 文件通配符
- 10.3. 命令行參數
- 10.4. 錯誤輸出重定向和程序終止
- 10.5. 字符串正則匹配
- 10.6. 數學
- 10.7. 互聯網訪問
- 10.8. 日期和時間
- 10.9. 數據壓縮
- 10.10. 性能度量
- 10.11. 質量控制
- 10.12. “瑞士軍刀”
- 11. 標準庫瀏覽 – Part II
- 11.1. 輸出格式
- 11.2. 模板
- 11.3. 使用二進制數據記錄布局
- 11.4. 多線程
- 11.5. 日志
- 11.6. 弱引用
- 11.7. 列表工具
- 11.8. 十進制浮點數算法
- 12. 接下來?
- 13. 交互式輸入行編輯歷史回溯
- 13.1. 行編輯
- 13.2. 歷史回溯
- 13.3. 快捷鍵綁定
- 13.4. 其它交互式解釋器
- 14. 浮點數算法:爭議和限制
- 14.1. 表達錯誤
- 15. 附錄
- 15.1. 交互模式