天天看點

collections.abc與abc子產品是同一個東西嗎?

emmm…在學習抽象基類時,我們接觸的就比python基礎更加的底層,于是很多莫名其妙的子產品接踵而來。比如首先看到了

from collections import abc

,後面又看到了

import abc

。就很好奇,兩個

abc

子產品是同一個子產品嗎?或者它們之間又有什麼關系呢?

colletions

這個子產品為開發者提供了一系列靈活、實用的類和方法。用起來也非常友善,具體如下:

collections.abc與abc子產品是同一個東西嗎?

從上圖我們發現

_collections_abc

子產品,實際上這是python3之後引入的子子產品。但是這跟

abc

子產品有什麼關系呢?還聽我通過源碼給你娓娓道來。

首先

colleticons

是我們的内置子產品,是以直接來到python下的Lib檔案夾下找

collections.abc與abc子產品是同一個東西嗎?

然後點選到

__init__.py

下檢視

collections.abc與abc子產品是同一個東西嗎?

我們發現,在

__init__.py

中,我們通過

__all__

指定允許外部通路的方法以及類。然後再往下看,在

colletions

子產品裡導入了

_collections_abc

的所有方法,并且将

__all__

又拼接上了

_collections_abc.__all__

。也就是說,我們可以在

collections

裡面通路

abc

,即

collections.abc

仍然不能高興太早,因為現在我們并不确定此

abc

是不是彼

abc

。是以我們打開

collections.abc與abc子產品是同一個東西嗎?
collections.abc與abc子產品是同一個東西嗎?

點選

_collections_abc

進去,源碼如下:

collections.abc與abc子產品是同一個東西嗎?

通過源碼,其實我們看出來

_collections_abc

是從

abc

子產品中導入了

ABCMeta

抽象基類等等。

與此同時,有的朋友還很好奇

Lib

下的

abc

子產品藏着哪些奧秘,我們也一樣來看到其源碼

collections.abc與abc子產品是同一個東西嗎?

奧,搞定。

但是來一個小小的總結啦~

  • collections.abc

    中的

    abc

    子產品實際上是從

    Lib/abc

    導入抽象基類(

    ABCMeta

    abstractmethod

    ),進而封裝了一系列有趣的、有自己功能的抽象基類,比如

    Sized

  • Lib/abc

    本質就是一個單獨子產品,是用來定義抽象基類的,也可以說是抽象基類的接口。