第6章:繼承和抽象類
- 繼承
- 新的類通過繼承可以獲得已有類的所有特性和行為
- 繼承允許兩個類(子類和超類)之間共享資料和方法
- 可以複用已有的程式碼,從而消除冗餘性
- 使得軟體系統的維護和驗證變得簡單
- 子類通過修改自己的方法或者新增新的方法,從而將超類的行為特殊化
- 子類可以呼叫超類的方法,需要使用超類的名稱作為該方法的字首
- 使用繼承定製一個已有的類
- 已有類的子類化
- 子類和超類(父類)的繼承關係
- 建立已有類的一個子類的步驟
- 為了保證能夠實現繼承,必須將父類名稱放在類宣告頭部的圓括號中
- 修改必須修改的方法的程式碼( 包括 __init__ 方法 )
- 新增新的方法
- __init__ 方法
- 在子類中呼叫父類的方法
- <parent class name>.<method name>( self, <other arguments> )
- 示例
-
"""
File: arraysortedbag.py
"""
from arraybag import ArrayBag
class ArraySortedBag( ArrayBag ):
"""An array-based sorted bag implementation."""
#Constructor
def __init__( self, sourceCollection = None ):
"""Sets the initial state of self, which includes the contents
of sourceCollection, if it's present."""
ArrayBag.__init__( self, sourceCollection )
- 新增新的 contains 方法
- 在有序包上執行二叉搜尋
-
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author:Lijunjie
"""
File: arraysortedbag.py
"""
from arraybag import ArrayBag
class ArraySortedBag( ArrayBag ):
"""An array-based sorted bag implementation."""
#Constructor
def __init__( self, sourceCollection = None ):
"""Sets the initial state of self, which includes the contents
of sourceCollection, if it's present."""
ArrayBag.__init__( self, sourceCollection )
#Accessor method
def __contains__( self, item ):
"""Return True if item is in self, or False otherwise"""
left = 0
right = len( self ) - 1
while left <= right:
midpoint = ( left + right ) // 2
if self._items[midpoint] == item :
return True
if self._items[midpoint] > item :
right = midpoint - 1
else:
left = midpoint + 1
return False
- 修改已有的 add 方法
- 程式碼
-
#Mutator method
def add( self, item ):
"""Adds item to self."""
#Empty or last item, call ArrayBag.add
if self.isEmpty() or item >= self._items[len( self ) - 1]:
ArrayBag.add( self, item )
else:
#Resize the array if it is full here
#Search for the first item > = new item
targetIndex = 0
while item > self._items[targetIndex]:
targetIndex += 1
#open a hole for a newitem
for index in range( len( self ), targetIndex, -1 ):
self._items[index] = self._items[index - 1]
#insert item and update size
self._items[targetIndex] = item
self._size += 1
- ArraySortedBag的執行時間效能
- Python中的類層級
- Python 所有的內建的類都位於一個層級中,這個層級的最項端或根部的是 object 類。
- Python支援對多個父類的子類化和繼承
- 使用抽象類去除程式碼的冗餘性
- 抽象類
- 抽象類是一種超類
- 它捕獲了相關一組類的通用特徵和行為,從而可以去除已知類中冗餘的方法和資料
- 抽象類不能正常的例項化,它的子類叫做具體類
- 設計一個 AbstractBag 類
- 冗餘的方法
- 最顯而易見的冗餘的方法是直接呼叫其他方法,並且沒有直接訪問例項變數的那些方法
- 冗餘的變數
- 要找出冗餘,必須檢視該變數引用的是何種資料型別
- 抽象類的框架
- 重寫 AbstractBag 中的 __init__ 方法
- 程式碼
-
"""
File: abstractbag.py
Author: Lijunjie
"""
class AbstractBag( object ):
"""An abstract bag implementation."""
#Constructor
def __init__( self, sourceCollection = None ):
"""Sets the initial state of self, which includes the contents
of sourceCollection, if it's present."""
self._size = 0
if sourceCollection:
for item in sourceCollection:
self.add( item )
- 修改 AbstractBag 的子類
-
"""
File: arraybag.py
Author: Lijunjie
"""
from arrays import Array
from abstractbag import AbstractBag
class ArrayBag( AbstractBag ):
"""An array-based bag implementation."""
#Class variable
DEFAULT_CAPACTIY = 10
#Constructor
def __init__( self, sourceCollection = None ):
"""Sets the initial state of self, which includes the contents
of sourceCollection, if it's present."""
self._items = Array( ArrayBag.DEFAULT_CAPACTIY )
AbstractBag.__init__( self, sourceCollection )
- 將 AbstractBag 中的 __add__ 方法泛化
- 使用 type 函式來獲取
相關推薦
第6章:繼承和抽象類
繼承 新的類通過繼承可以獲得已有類的所有特性和行為 繼承允許兩個類(子類和超類)之間共享資料和方法 可以複用已有的程式碼,從而消除冗餘性 使得軟體系統的維護和驗證變得簡
JAVA-初步認識-第九章-接口和抽象類的區別
nbsp 技術分享 領域分析 ava 認識 com 子類 功能 接口 一. 接口和抽象類之間的區別 抽象類定義兩個方法,接口中也可以定義兩個方法,那麽在定義的時候,到底是定義抽象類還是接口呢? 繼承和實現是兩回事。 抽煙不是學員的基本功能,是學員的擴展功能。學員要抽煙,就
第七章:模組和庫類
第一節:關於模組和類庫 使用系統標準庫 什麼是模組? 可以說,一個 xxx.py 就是一個模組。 什麼是類庫? 裝有很多個模組的資料夾包,可以稱為一個類庫,更多的時候,這些python檔案都是有機關聯的。 有了模組和類庫,我們可以輕鬆地站在巨人的肩膀上進行程
C#基礎-第6章:型別和成員基礎
本章內容: 型別的各種成員 型別的可見性 成員的可訪問性 靜態類 分部類,結構和介面 元件、多型和版本控制 // #define 可以按版本執行不同的程式碼塊 #define V1 //#define V2a //#define V2b //#define V2c #
C#本質論6.0第四章:方法和參數
有助於 異常 名稱 別名 不同的 元素 寫入 轉換 參數順序 方法和參數 方法組合一系列語句以執行特定操作或計算特定結果,它能夠為構成程序的語句提供更好的結構和組織。 方法總是和類型——通常是類關聯。 方法通過實參接收數據,實參由方法的參數或形參定義,參數是調用者用於向被
C#本質論6.0第六章:繼承
行為 實體 sta 密封類 類型 繼承鏈 tac 預測 兩個類 基類型與派生類型之間的轉型: 顯式轉型與隱式轉型: 從派生類型轉型為基類型稱為隱式轉型,轉型總會成功,不會引發異常。 從基類型轉型為派生類型稱為顯式轉型,在轉型過程中可能會失敗,為了執行顯示轉型,要在原始引用名
《作業系統》第6章:併發:死鎖和飢餓
1,什麼是死鎖: 一組程序中,每個程序都無限等待被該組程序中另一個程序所佔有的資源,因而永遠無法得到的資源,這種現象稱為程序死鎖,這一組程序就稱為死鎖程序(處於阻塞態) 2,什麼是可重用資源?(P186) 一次只能供一個程序安全地使用,並且不會由於使用而耗盡的資源。程序得
GObject學習教程---第六章:GObject 的子類繼承
本文是學習學習他人的部落格的心得(具體詳見“樓主見解”),如果源網站可訪問的話,建議直接訪問源網站: 樓主見解: 此章節和繼承GObject一樣,只是換一個基類而已,繼承機制一樣。 f:GObject 的子類繼承 在文件 [1] 中,我們構造了一個 KbB
《Java從入門到失業》第五章:繼承與多型(5.8-5.10):多型與Object類
5.8多型 上面我們瞭解了向上轉型,即一個物件變數可以引用本類及子類的物件例項,這種現象稱為多型(polymorphism)。多型究竟有什麼用呢?我們先學習一個知識點。 5.8.1方法重寫  
讀構建之法 第五章:團隊和流程
min 這樣的 程序員 希望 成員 eat 貢獻 核心 不能 團隊有一致的集體目標,團隊要一起完成這目標。一個團隊的成員不一定要同時工作,例如接力賽跑。 團隊成員有各自的分工,互相依賴合作,共同完成任務。 軟件團隊有各種形式,適用於不同的人員和需求。基於直覺形成的團隊模式未
第6章 靜態路由和動態路由(1)_靜態路由
align 將在 跟蹤 添加 測試 字母 ppp協議 必須 缺少 1. 路由——網絡層實現的功能 1.1 路由功能 (1)網絡層的功能:給傳輸層協議提供簡單靈活的、無連接的、盡最大努力交付的數據包服務。 (2)路由器為每一個數據包單獨地選擇轉發路徑,網絡層並不提供服務質量的
python+selenium自動化軟件測試(第6章):selenium phantomjs頁面解析使用
前端 down word logs pan canvas 鼠標 agent 瀏覽器中 我們都知道Selenium是一個Web的自動化測試工具,可以在多平臺下操作多種瀏覽器進行各種動作,比如運行瀏覽器,訪問頁面,點擊按鈕,提交表單,瀏覽器窗口調整,鼠標右鍵和拖放動作,下拉框和
繼承和抽象類思想
得到 參數 指定 function nds struct 不一致 ray 訪問修飾符 訪問修飾符 public:公共的,共有的,公開的(可以在“任何位置”使用) protected:受保護的(可以在當前類或繼承關系中使用) private:私有的(只能在其所在的
第六章 初始繼承和多態
機制 但是 就是 概念 base 類的設計 類重寫 結構 冗余 1.繼承的概念 其實生活中有很多繼承的例子。例如,在馬路上跑的卡車,我們每天都乘坐的公共汽車,它們都是汽車。卡車有自己的特征:有貨艙,有額定載重,行為都是可以拉貨、卸貨。而公共汽車的特征和行為:有客艙,有載客量
C++ Primer Plus第六版編程練習---第6章 分支語句和邏輯運算符
character value ati ostream wing style ces col code 1、 1 #include <iostream> 2 #include <string> 3 #include <cctype>
CLR via C#學習筆記-第九章-參數和返回類型的設計規範
nbsp 其他 oid class style network ring enum 學習 9.5 參數和返回類型的設計規範 聲明方法的參數類型,應盡量指定最弱的類型,寧願要接口也不要基類。 例如寫方法來處理一組數據項,最好用接口,比如IEnumerable<T>
第4章:資料和連結串列結構
資料結構是表示一個集合中包含的資料的一個物件 陣列資料結構 陣列是一個數據結構 支援按照位置對某一項的隨機訪問,且這種訪問的時間是常數 在建立陣列時,給定了用於儲存資料的位置的一個數目,並且陣列的長度保
讀書筆記--《程式設計師的自我修養》第2章:編譯和連結
一、從原始碼到可執行檔案的過程 分為4個步驟:預處理(prepressing)、編譯(compilation)、彙編(assembly)和連結(linking)。如圖所示 1、預編譯 (1)首先,原始碼檔案和相關的標頭檔案,會被預編譯器預編譯為一個.i檔案。 對於C++程式來
第5章:座標和依賴/5.2 座標詳解
座標詳解 座標內容包括 groupid:必選 概念:通用用java包的形式表示(也就是.(點)表示法),內容一般是組織或者公司下的某個專案 例如:org.sonatype.nexus,org.sonatype 為非盈利組織
第5章:座標和依賴/5.9 最佳實踐/5.9.2 依賴屬性使用變數
依賴屬性使用變數 概念:用變數定義依賴的某一部分屬性,具體依賴中直接使用這個依賴即可,這樣做的好處是以後修改這個屬性時只需要修改這個變數即可 語法: 定義變數: <properties> <!—變數名--> <spring