1. 程式人生 > >Python3學習(25)--多繼承之mix-in("混入")技術

Python3學習(25)--多繼承之mix-in("混入")技術

前面,我們學習過OOP的繼承,知道子類可以繼承父類的特性,可以拿來用,也可以改變父類的特性變為已有,當然,我們只是學習了一種繼承關係,今天,我們要重新認識一下Python的繼承之

多繼承

靜態語言中,C++支援多繼承,一個子類可以擁有多個父類,但是對於Java來說,就不行了,只能實現單繼承,Java可以巧妙的利用實現多個介面(interface),內部類等來實現這種"多繼承"。

動態語言中,Python是沒有介面的,本身也不提供抽象類一說,為什麼要像Java一樣,當一個類實現一個介面的時候,它必須實現介面中宣告的所有方法,否則會出錯。我們的Python才不會這麼設計,一方面是因為它支援多重繼承,另一方面,是因為Python活潑,

,我們可以設計一個"偽介面"如下:

class interface():

            pass

如果是Java的話,interface中你需要事先宣告好方法體,不然,你讓別人實現你介面什麼呢?

但是我們的Python,可以動態給interface繫結方法甚至變數

import types

def func(*args,**others): #定義一個方法

          #do something

interface.my_func = types.MethodType(func,interface)  #給介面繫結一個介面方法,方法顯然已被實現

i = interface()    #介面例項(其實就是類,這裡我們模仿介面)

i.my_func(*args,**others)  #類的屬性,可以被所有屬於類的例項訪問,因此這裡我們用介面例項呼叫方法

看了上面的虛擬碼後,我們是不是覺得,介面對於Python來說意義不大?來來,我們圍觀一下執行結果:


不止一種?

今天雖說是講多繼承的,但是我們不得不說下,介面這個事,既然語言又不止Python一種,我們何不多花點時間多學一點呢?

抽象類

Python本身不提供抽象類,但是,我們可以藉助abc模組,進行抽象類的模擬和實現(等同於Java介面的定義)

我們看下demo:

#!/usr/bin/env Python3
# -*- encoding:UTF-8 -*-

from  abc import ABCMeta,abstractmethod #abc模組提供抽象類機制 

class interface(metaclass = ABCMeta): #指定當前類是一個抽象類
    @abstractmethod  #指定抽象方法
    def A(self):
        pass
    @abstractmethod
    def B(self):
        pass
     
i = interface()



我們猜測一下,這個抽象類能不能被例項化,也就是上述的最後一行程式碼可行否?我們看下,IDE給我們的答案是什麼:


上述的意思,大概是,我們必須先實現抽象類interface的兩個方法A和B,是必須! 下面我們定義一個類,繼承這個inteface,並實現抽象方法A和B:

#!/usr/bin/env Python3
# -*- encoding:UTF-8 -*-

from  abc import ABCMeta,abstractmethod #abc模組提供抽象類機制 

class interface(metaclass = ABCMeta): #指定當前類是一個抽象類
    @abstractmethod  #指定抽象方法
    def A(self):
        pass
    @abstractmethod
    def B(self):
        pass
     
class Implement(interface):
    def A(self):
        print("必須實現抽象方法A")
    def B(self):
        print("必須實現抽象方法B")
        
impl = Implement()
impl.A()
impl.B()

如果我們在實現類Implement中沒有實現方法B,會提示如下:


但是我們全部實現後,就會很順暢的輸出結果如下:


利用Python的abc模組,我們可以將抽象機制應用在介面上,從而"實現介面"

回到本篇的內容,我們說下多繼承

我們知道青蛙Frog,是兩棲動物,既可以在陸地上跑,也可以在水裡遊,如果跑和遊是兩個更加抽象的類,需要被具體的話,那麼僅憑單繼承的話,青蛙只能繼承一種父類行為,要麼跑,要麼遊,假設,我們讓青蛙先繼承跑,然後,在這種跑的行為上,為青蛙"混入"額外的功能遊,那麼就必須讓青蛙再繼承遊才行,這就必須要用到多繼承了,這種設計模式在Python中稱之為MixIn,中文我們就稱"混入"吧。

針對上面描述的,我們設計我們的demo如下:

#!/usr/bin/env Python3
# -*- encoding:UTF-8 -*-

class Runnable():
    def run(self):
        print("I can run...")
        
class Swimable():
    def swim(self):
        print("I can swim...")        

class Frog(Runnable,Swimable):
    pass

print(Frog.__bases__)

我們利用類的屬性__bases__打印出,當前類所繼承的父類有哪些:


當然,如果我們的類,沒有顯示指明繼承的父類,預設都是object:


我們看下值,不難發現,類的屬性__bases__的值是一個tuple元組

其實,多繼承很好理解,我們看下,青蛙王子,現在是不是既可以跑又可以遊了:


so,多繼承又扯了這麼多,是時候該結束本篇的內容了,下一篇,我們再繼續............

相關推薦

Python3學習(25)--繼承mix-in"混入"技術

前面,我們學習過OOP的繼承,知道子類可以繼承父類的特性,可以拿來用,也可以改變父類的特性變為已有,當然,我們只是學習了一種繼承關係,今天,我們要重新認識一下Python的繼承之 多繼承 靜態語言

【Mac + Python3.6 + facebook-wda】IOS自動化:安裝facebook-wda庫並編寫簡易自動化測試腳本

以及 應用 hot cit you ins dfa 查看端口 介紹 上一篇介紹完如何安裝WDA,接下來開始正式安裝開發庫並編寫自動化腳本。 目錄: 一、安裝facebook-wda庫 二、通過WEditor定位元素 三、附錄:學習資料

機器學習十大演算法決策樹詳細

什麼是決策樹? 如何構建決策樹? ID3 C4.5 CART 決策樹的優缺點及改進 什麼是決策樹? 決策樹是運用於分類的一種樹結構,其本質是一顆由多個判斷節點組成的樹,其中的每個內部節點代表對某一屬性的一次測試,每條邊代表一個測試結果,而葉節點代表某個類或類的分佈。 屬於有監督學習 核心思想:

記慕課學習秒殺系統DAO層

作為一名初學框架的菜鳥,記錄這一次在慕課學習整個框架基礎功能的過程,與大家共勉! 本專案利用SSM框架,完成了秒殺專案簡單的增刪改查功能,對初學框架的小菜鳥(比如我)有非常好的指導作用。 專案開發所用工具:IDEA開發環境,jdk1.8,Mysql 8.0.

一對通訊socket程式設計程序

1 一對多模型,TCP的程式設計步驟 服務端: 1、socket()獲得一個sockfd。注意第二個引數必須SOCK_STREAM. 2、準備通訊地址(必須伺服器的) 3、bind()繫結。(開放了埠,允許客戶端連線) 4、監聽客戶端 list

Unity3D學習 憤怒的小鳥Logo介面

接下來的幾周內,我準備把對如何用Unity3D製作憤怒的小鳥的研究過程記錄下來,希望能完成憤怒的小鳥遊戲的大部分功能。 好記性不如爛筆頭,開始吧! 目標:製作開頭loading時的Logo介面,4秒後進入下一個介面。 1.  建一個空Project,將螢幕解析度改為

深入學習c++--線程編程

template ise div lib 如果 temp push_back thread += 1. 簡介 2. 線程使用 2.1 demo #include <iostream> #include <thread> #inc

深入學習c++--線程編程thread的兩種死法

sleep str world 線程編程 執行 mes obj future name 1. 生成了一個線程,需要告訴編譯器是否管理 必須告訴編譯器是不管理還是管理,否則直接down了 #include <iostream> #include <

Python繼承MRO算法

tro 拓撲排序 png mage __name__ 技術分享 ima bject import MRO即Method Resolution Order 方法解析順序,它的提出主要是為了解決Python中多繼承時,當父類存在同名函數時,二義性的問題 下面先看一個例子:

python3.5進階-------------實現協程生成器,迭代器

1.迭代器:迭代是訪問集合元素的一種方式,迭代器是可以記住遍歷的位置的物件,迭代器物件從集合的第一個元素開始訪問,直到所有訪問結束,迭代器只能前進不能後退。判斷一個數據型別是否可以迭代,看是否能for迴圈。如(字串,列表,元祖...)序列可以迭代,數字不能迭代,或通過isintance([11,12

繼承MRO

一,python2和python3的區別   在python2中存在兩種類:一個叫經典類,在python2.2之前,一直用的是經典類,經典類如果在基類的根什麼都不寫,那麼它就是根;還有一個叫新式類,在python2.2之後出現的,新式類的特點就是所有基類的根都是object。   在python3中只存在

python繼承C3演算法

python多繼承的MRO演算法之C3演算法. C3演算法的解析: 備註:O==object2.python-C3演算法解析:#C3 定義引用開始C3 演算法:MRO是一個有序列表L,在類被建立時就計算出來。L(Child(Base1,Base2)) = [ Chil

C#學習基礎回顧16----- 程序和執行緒

程序 程序(Process)是Windows系統的一個基本概念。一個應用程式在作業系統中執行被視為一個程序,程序可以包括一個或多個執行緒。 程序之間是相對獨立的,一個程序無法訪問另一個程序的資料(除非使用分散式計算方式),一個程序執行失敗也不會影響另一個程序。 執行緒

Java面向物件與執行緒綜合實驗封裝、繼承

編寫一個程式,實現檔案管理系統中的使用者管理模組。要求模組中實現使用者的模擬登入過程。通過使用者輸入,獲取使用者名稱和口令;與事先記錄在程式中的使用者資訊進行對比,通過口令驗證後才能使用系統。使用者分為系統管理人員、檔案錄入人員,檔案瀏覽人員三類,相關類圖如下所示。 (1)要求在使用者類中

Python3學習筆記--執行緒

python並非真正意義上的多執行緒,不支援多核,只能單核,這是因為全域性鎖的原因 如果多個執行緒共享一個記憶體,如何做限制: threading.RLock() lock.release() .join:表示必須等上一個函式執行完再執行下一個函式

學習MVC租房網站- 前臺註冊和登錄

設置 rup 密碼錯誤 發送短信 mvc 短信驗證 ont 上傳 錯誤 在上一篇<學習MVC之租房網站(七)-房源管理和配圖上傳>完成了在後臺新增、編輯房源信息以及上傳房源配圖的功能。到此後臺開發便告一段落了,開始實現前臺的功能,也是從用戶的登錄、註冊開始。 前

學習MVC租房網站-房源顯示和搜索

下使用 server epic 位置 edit 電商 給定 針對 富文本 在上一篇<學習MVC之租房網站(八)- 前臺註冊和登錄>完成了前臺用戶的註冊、登錄、重置密碼等功能,然後要實現與業務相關的功能,包括房源的顯示、檢索等。 一 房源顯示 房源顯示內容較多

FPGA學習數碼管封裝顯示時間

rtu 環境 tro gb2312 配置 fpga 模塊 rtl 顯示時間 一、實驗目的:學習數碼管封裝以及顯示時間。二、實驗環境:FPGA開發板AX301,Quartus ii三、實驗介紹:將數碼管顯示模塊封裝起來,同時通過不斷讀取RTC時鐘的時分秒值,將之顯示在數碼管。

CSS3學習系列選擇器

計算 選擇器 sky :focus ddr gree for 指定元素 學習 first-child選擇器和last-child選擇器 first-child指定第一個元素。last-child指定最後一個子元素。 例如: <!DOCTYPE html>

STM32學習路-LCD4&lt;顯示字符&gt;

計算 ack 字節 ring oid ng- 透明 標點符號 函數 昨晚瘋狂的打了一夜的LOL,感覺L多了,今天一天精神萎靡.還是繼續把顯示字符給看了,可是在猶豫要不要寫這篇文章 事實上寫的東西也就是copy別人家的代碼,不想寫那麽多,就記錄下自己困惑的地方吧.也