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