1. 程式人生 > >第6章:繼承和抽象類

第6章:繼承和抽象類

    • 繼承
      • 新的類通過繼承可以獲得已有類的所有特性和行為
        • 繼承允許兩個類(子類和超類)之間共享資料和方法
        • 可以複用已有的程式碼,從而消除冗餘性
        • 使得軟體系統的維護和驗證變得簡單
        • 子類通過修改自己的方法或者新增新的方法,從而將超類的行為特殊化
        • 子類可以呼叫超類的方法,需要使用超類的名稱作為該方法的字首
    • 使用繼承定製一個已有的類
      • 已有類的子類化
        • 子類和超類(父類)的繼承關係
          • clip_image001[4]
          • 由於 ArrayBag 類實現了 BagInterface,所以 ArraySortedBag 也通過繼承實現了這個介面
        • 建立已有類的一個子類的步驟
          • 為了保證能夠實現繼承,必須將父類名稱放在類宣告頭部的圓括號中
          • 修改必須修改的方法的程式碼( 包括 __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的執行時間效能
        • ArraySortedBag__contains__方法的時間複雜度從  降為 (logn),從而優化了其它藉助於 __contains__方法的方法,即 in 運算子。比如 __eq__ 方法。clip_image002[4]
      • Python中的類層級
        • Python 所有的內建的類都位於一個層級中,這個層級的最項端或根部的是 object 類。
        • Python支援對多個父類的子類化和繼承
    • 使用抽象類去除程式碼的冗餘性
      • 抽象類
        • 抽象類是一種超類
        • 它捕獲了相關一組類的通用特徵和行為,從而可以去除已知類中冗餘的方法和資料
        • 抽象類不能正常的例項化,它的子類叫做具體類
      • 設計一個 AbstractBag
        • 冗餘的方法
          • 最顯而易見的冗餘的方法是直接呼叫其他方法,並且沒有直接訪問例項變數的那些方法
        • 冗餘的變數
          • 要找出冗餘,必須檢視該變數引用的是何種資料型別
        • 抽象類的框架
          • clip_image003[4]
          • 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