最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解Python是如何實(shí)現(xiàn)issubclass的

 更新時(shí)間:2019年07月24日 14:49:21   作者:EVE  
這篇文章主要介紹了詳解Python是如何實(shí)現(xiàn)issubclass的,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

使用Python內(nèi)置的issubclass方法很方便的檢測一個(gè)類是否是另一個(gè)類的子類。

這個(gè)是issubclass的文檔:

issubclass(class, classinfo)

Return true if class is a subclass (direct, indirect or virtual) of classinfo. A class is considered a subclass of itself. classinfo may be a tuple of class objects, in which case every entry in classinfo will be checked. In any other case, a TypeError exception is raised.

一個(gè)類的子類可以是直接的、間接的、或者是虛擬的。

issubclass的第二個(gè)參數(shù)classinfo可以是一個(gè)類對象或者包含類對象的tuple(只要其中一個(gè)檢測成功即返回True)。

一些使用示例:

>>> class A(object):
...   pass
...
>>> class B(A):
...   pass
...
>>> class C(B, A):
...   pass
...
>>> class D(C):
...   pass
...
>>> issubclass(D, D), issubclass(D, C), issubclass(D, B), issubclass(D, A), issubclass(D, object)
(True, True, True, True, True)
>>> D.__bases__
(<class '__main__.C'>,)
>>> D.__mro__
(<class '__main__.D'>, <class '__main__.C'>, <class '__main__.B'>, <class '__main__.A'>, <class 'object'>)

D是D的子類,D定義時(shí)的基類是C,所以D是C的子類,而且D是B,A,object的間接子類。

__mro__是類屬性, 在類定義完畢Python解析器便通過一種C3算法將所有的父類以method resolution order的順序保存到一個(gè)元組里, 成為類的屬性。

所以issubclass可以這樣簡單的實(shí)現(xiàn):

def issubclass(cls, classinfo):
  if classinfo in cls.__mro__:
    return True
  return False

Python的issubclass是內(nèi)置函數(shù)(一般是C實(shí)現(xiàn)),實(shí)際上要復(fù)雜很多,要檢測參數(shù)類型,如第一個(gè)參數(shù)必須是type類型,第二個(gè)參數(shù)是type類型或者tuple類型。還要考慮該類是否是虛擬的子類,以及子類的子類。

例如:

>>> from collections import abc
>>> class E:
...   def __len__(self):
...     return 1
...
>>> issubclass(E, abc.Sized)
True
>>> E.__mro__
(<class '__main__.E'>, <class 'object'>)
>>> class F:
...   pass
...
>>> issubclass(F, abc.Sized)
False
>>> abc.Sized.register(F)
<class '__main__.F'>
>>> issubclass(F, abc.Sized)
True

Python是動態(tài)類型語言,長久以來使用Duck type(鴨子類型)形式編程,不管對象是什么類型,只要實(shí)現(xiàn)了所需要的方法。

現(xiàn)在有了ABCs, 可以用于判斷某個(gè)類或者某個(gè)對象是不是ABCs的子類或者實(shí)例,但這個(gè)類并不需要顯示的繼承于ABCs, 因?yàn)閜ython內(nèi)置的ABCs有一種注冊機(jī)制可將一個(gè)類注冊為它的子類。如上例子的register方法。

還有一種機(jī)制是可以定制一個(gè)__subclasshook__方法,將某種類型的類認(rèn)定為子類。

如abc.Sized的__subclasshook__是這樣子的:

@classmethod
def __subclasshook__(cls, C):
  if cls is Sized:
    if any("__len__" in B.__dict__ for B in C.__mro__):
      return True
  return NotImplemented

所以有__len__方法的E類是abc.Sized的子類, 這個(gè)__subclasshook__方法是通過__subclasscheck__方法調(diào)用的,這個(gè)__subclasscheck__是每一個(gè)ABC類都有的方法,在ABCMeta類(其他ABC類都繼承于它)實(shí)現(xiàn)。

現(xiàn)在的issubclass函數(shù)的實(shí)現(xiàn),會先判斷classinfo是否有__subclasscheck__方法,如果有此方法,則判斷子類的邏輯由該方法返回,即覆蓋issubclass的實(shí)現(xiàn)(CPython)。

__subclasscheck__會分幾個(gè)步驟進(jìn)行判斷:

  1. 調(diào)用__subclasshook__方法,如果有方法定義
  2. 檢查自己是否在待檢測類的__mro__列表里
  3. 遞歸檢查待檢測類是否是在注冊子類(內(nèi)置_abc_registry列表屬性)
  4. 遞歸檢查待檢測類是否是自己子類的子類

具體源碼在: https://github.com/python/cpython/blob/3.6/Lib/abc.py#L194-L231

相關(guān)的CPython實(shí)現(xiàn)在: https://github.com/python/cpython/blob/0ccc0f6c7495be9043300e22d8f38e6d65e8884f/Objects/abstract.c#L2223

而基本上isinstance(object, classinfo)方法的實(shí)現(xiàn)只需要調(diào)用issubclass(type(object), classinfo)

參考:

29.7. abc — Abstract Base Classes : https://docs.python.org/3/library/abc.html
PEP 3119 – Introducing Abstract Base Classes: https://www.python.org/dev/peps/pep-3119/

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • python日期與時(shí)間戳的各種轉(zhuǎn)換示例

    python日期與時(shí)間戳的各種轉(zhuǎn)換示例

    這篇文章主要介紹了python日期與時(shí)間戳的各種轉(zhuǎn)換示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-02-02
  • python datetime中strptime用法詳解

    python datetime中strptime用法詳解

    這篇文章主要介紹了python 中datetime中strptime用法,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-08-08
  • pyCharm中python對象的自動提示方式

    pyCharm中python對象的自動提示方式

    這篇文章主要介紹了pyCharm中python對象的自動提示方式,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • Python3直接爬取圖片URL并保存示例

    Python3直接爬取圖片URL并保存示例

    今天小編就為大家分享一篇Python3直接爬取圖片URL并保存示例,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-12-12
  • Pycharm 設(shè)置自定義背景顏色的圖文教程

    Pycharm 設(shè)置自定義背景顏色的圖文教程

    今天小編就為大家分享一篇Pycharm 設(shè)置自定義背景顏色的圖文教程,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-05-05
  • Pycharm如何導(dǎo)入python文件及解決報(bào)錯(cuò)問題

    Pycharm如何導(dǎo)入python文件及解決報(bào)錯(cuò)問題

    這篇文章主要介紹了Pycharm如何導(dǎo)入python文件及解決報(bào)錯(cuò)問題,本文通過示例截圖相結(jié)合給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-05-05
  • Python 用matplotlib畫以時(shí)間日期為x軸的圖像

    Python 用matplotlib畫以時(shí)間日期為x軸的圖像

    這篇文章主要介紹了Python 用matplotlib畫以時(shí)間日期為x軸的圖像,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08
  • Python實(shí)現(xiàn)按逗號分隔列表的方法

    Python實(shí)現(xiàn)按逗號分隔列表的方法

    今天小編就為大家分享一篇Python實(shí)現(xiàn)按逗號分隔列表的方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-10-10
  • Scrapy爬蟲實(shí)例講解_校花網(wǎng)

    Scrapy爬蟲實(shí)例講解_校花網(wǎng)

    下面小編就為大家?guī)硪黄猄crapy爬蟲實(shí)例講解_?;ňW(wǎng)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-10-10
  • 使用Python實(shí)現(xiàn)租車計(jì)費(fèi)系統(tǒng)的兩種方法

    使用Python實(shí)現(xiàn)租車計(jì)費(fèi)系統(tǒng)的兩種方法

    本文通過兩種方法給大家分享了使用Python實(shí)現(xiàn)租車計(jì)費(fèi)系統(tǒng),非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2018-09-09

最新評論

江源县| 临湘市| 宁都县| 云南省| 洞口县| 尚志市| 南和县| 陇西县| 白银市| 永胜县| 霍州市| 唐河县| 偏关县| 闽清县| 江安县| 永昌县| 淅川县| 沂源县| 廉江市| 咸宁市| 大冶市| 梧州市| 保靖县| 巩义市| 株洲市| 盐津县| 正定县| 鄯善县| 永宁县| 株洲市| 商南县| 晋宁县| 锡林浩特市| 义马市| 游戏| 普格县| 将乐县| 阿尔山市| 长子县| 炉霍县| 铁岭市|