国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Python基礎之接口——從協議到抽象基類

TwIStOy / 3295人閱讀

摘要:本文重點協議是中非正式的接口了解抽象基類的基本概念以及標準庫中的抽象基類掌握抽象基類的使用方法。三抽象基類的使用通過繼承聲明抽象基類聲明抽象基類最簡單的方式是繼承或其他抽象基類注意在之間,繼承抽象基類的語法是。

導語:本文章記錄了本人在學習Python基礎之面向對象篇的重點知識及個人心得,打算入門Python的朋友們可以來一起學習并交流。

本文重點:

1、協議是Python中非正式的接口;
2、了解抽象基類的基本概念以及標準庫中的抽象基類;
3、掌握抽象基類的使用方法。
一、協議的高度動態本性 1、協議與接口的基本概念

協議:是Python中非正式的接口,是令Python這種動態類型語言實現多態的方式。
接口:泛指實體把自己提供給外界的一種抽象化物(可以為另一實體),用以由內部操作分離出外部溝通方法,使其能被內部修改而不影響外界其他實體與其交互的方式。
類的接口:類實現或繼承的公開屬性(方法或數據屬性),包括特殊方法,如__getitem__或__add__。

2、協議是非正式的

協議是非正式的,只由文檔和約定定義,不具備強制性。
以序列協議為例,假設我們想實現迭代以及in運算,通常需要__iter__和__contains__方法,但事實上只實現__getitem__方法也可以。原因在于當Python發現沒有__iter__和__contains__可用時,會轉而調用__getitem__方法設法讓迭代和in運算符可用。
小結:部分實現協議是有用的。

3、使用猴子補丁在運行時實現協議

在運行時修改類或模塊而不改動源碼,從而實現目標協議接口的操作就是打猴子補丁。

二、抽象基類 1、基本概念

鴨子類型(duck typing):不關注對象的類型,而是關注對象具有的行為(方法)。鴨子類型像多態一樣工作,但是沒有繼承。
在鴨子類型中,協議風格的接口與繼承完全沒有關系,實現同一個協議的各個類是相互獨立的。

白鵝類型(goose typing):只要cls是抽象基類,即cls的元類是abc.ABCMeta,就可以使用isinstance(obj,cls)。

抽象基類(abstract base class,ABC):抽象基類就是類里定義了純虛成員函數的類。純虛函數只提供了接口,并沒有具體實現。抽象基類不能被實例化(不能創建對象),通常是作為基類供子類繼承,子類中重寫虛函數,實現具體的接口。簡言之,ABC描述的是至少使用一個純虛函數的接口,從ABC派生出的類將根據派生類的具體特征,使用常規虛函數來實現這種接口。

2、標準庫中的抽象基類

(1)collections.abc中抽象基類
collections.abc模塊中各個抽象基類的UML類圖如下所示:

Iterable、 Container 和 Sized
各個集合應該繼承這三個抽象基類, 或者至少實現兼容的協議。
Iterable 通過 __iter__ 方法支持迭代;
Container 通過__contains__ 方法支持 in 運算符;
Sized 通過 __len__ 方法支持len() 函數。

Sequence、 Mapping 和 Set
這三個是主要的不可變集合類型, 而且各自都有可變的子類。

MappingView
在 Python 3 中, 映射方法 .items()、 .keys() 和 .values() 返回的對象分別是 ItemsView、 KeysView 和 ValuesView 的實例。 前兩個類還從 Set 類繼承了豐富的接口,涉及集合的全部運算符。

Callable 和 Hashable
這兩個抽象基類與集合沒有太大的關系,只不過因為collections.abc 是標準庫中定義抽象基類的第一個模塊, 而它們又太重要了,因此才把它們放到 collections.abc 模塊中。Callable 或 Hashable 的子類非常少見。這兩個抽象基類的主要作用是為內置函數 isinstance 提供支持,以一種安全的方式判斷對象能不能調用或散列。

Iterator
是 Iterable 的子類。

(2)numbers包中的數字塔
按照自上而下的線性結構,Number是位于最頂端的超類,詳細排序如下:

Number

Complex

Real

Rational

Integral

例如,檢查一個數是否是整數,可以使用isinstance(x,numbers.Integral)。

三、抽象基類的使用 1、通過繼承聲明抽象基類

聲明抽象基類最簡單的方式是繼承abc.ABC或其他抽象基類:Class Student(abc.ABC)
注意:在Python3.0~3.3之間,繼承抽象基類的語法是:Class Student(metaclass=abc.ABCMeta)。

2、判斷子類是否符合接口定義

在定義抽象基類的子類時,子類需要將繼承的抽象基類中的抽象方法具體實現。

3、聲明虛擬子類實現抽象基類的接口

虛擬子類:指的是不通過繼承而利用注冊把一個類變成抽象基類的子類。
注冊虛擬之類的方式是調用register方法,語法是@抽象基類名稱.register。
經注冊后的虛擬子類可以被issubclass和isinstance等函數識別,但是注冊的類不會從抽象基類中繼承任何方法或屬性。具體可通過類屬性__mro__查看類的真實繼承關系。

四、其它

1、抽象基類中聲明抽象類方法需要使用@abc.abstractmethod標記,并且在@abc.abstractmethod和def之間不能有其他裝飾器。
2、內省類的繼承關系的方法:
__subclasses__():返回類的直接子類列表,不含虛擬子類。
__abcregistry:抽象基類獨有的屬性,是抽象類注冊的虛擬子類的弱引用。
3、__subclasshook__:令抽象基類識別沒有進行子類化和注冊的類,此方法在abc.Sized中有應用。

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/41315.html

相關文章

  • Python學習路30-接口協議抽象基類

    摘要:本篇內容將從鴨子類型的動態協議,逐漸過渡到使接口更明確能驗證實現是否符合規定的抽象基類。抽象基類介紹完動態實現接口后,現在開始討論抽象基類,它屬于靜態顯示地實現接口。標準庫中的抽象基類從開始,標準庫提供了抽象基類。 《流暢的Python》筆記。本篇是面向對象慣用方法的第四篇,主要討論接口。本篇內容將從鴨子類型的動態協議,逐漸過渡到使接口更明確、能驗證實現是否符合規定的抽象基類(Abst...

    LucasTwilight 評論0 收藏0
  • 流暢的python讀書筆記-第11章-接口協議抽象基類

    摘要:自己定義的抽象基類要繼承。抽象基類可以包含具體方法。這里想表達的觀點是我們可以偷懶,直接從抽象基類中繼承不是那么理想的具體方法。 抽象基類 抽象基類的常見用途: 實現接口時作為超類使用。 然后,說明抽象基類如何檢查具體子類是否符合接口定義,以及如何使用注冊機制聲明一個類實現了某個接口,而不進行子類化操作。 如何讓抽象基類自動識別任何符合接口的類——不進行子類化或注冊。 接口在動態類...

    Kyxy 評論0 收藏0
  • Python中繼承的優缺點

    摘要:本文重點不要試圖在內置類型的子類中重寫方法,可以繼承的可拓展類尋求變通掌握多重繼承中的和了解處理多重繼承的一些建議。子類化的代碼如下輸出小結上述問題只發生在語言實現的內置類型子類化情況中,而且只影響直接繼承內置類型的自定義類。 導語:本文章記錄了本人在學習Python基礎之面向對象篇的重點知識及個人心得,打算入門Python的朋友們可以來一起學習并交流。 本文重點: 1、不要試圖在內置...

    Sourcelink 評論0 收藏0
  • [Python3]Python面向對象的程序設計

    摘要:于發表了著名的有害論的論文引起了長達數年的論戰并由此產生了結構化程序設計方法。到現在為止面向對象已經成為了主流的開發思想。面向對象的程序設計優點解決了程序的擴展性。 [Python3]Python面向對象的程序設計 一、面向對象的程序設計的由來 1.第一階段:面向機器,1940年以前 最早的程序設計都是采用機器語言來編寫的,直接使用二進制碼來表示機器能夠識別和執行的指令和數據。 簡單來...

    OpenDigg 評論0 收藏0
  • Python學習路25-使用一等函數實現設計模式

    摘要:本篇主要講述中使用函數來實現策略模式和命令模式,最后總結出這種做法背后的思想。 《流暢的Python》筆記。本篇主要講述Python中使用函數來實現策略模式和命令模式,最后總結出這種做法背后的思想。 1. 重構策略模式 策略模式如果用面向對象的思想來簡單解釋的話,其實就是多態。父類指向子類,根據子類對同一方法的不同重寫,得到不同結果。 1.1 經典的策略模式 下圖是經典的策略模式的U...

    econi 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<