亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

使用Python實現issubclass的方法

發布時間:2021-02-03 13:37:30 來源:億速云 閱讀:199 作者:小新 欄目:開發技術

小編給大家分享一下使用Python實現issubclass的方法,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

使用Python內置的issubclass方法很方便的檢測一個類是否是另一個類的子類。

這個是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.

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

issubclass的第二個參數classinfo可以是一個類對象或者包含類對象的tuple(只要其中一個檢測成功即返回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定義時的基類是C,所以D是C的子類,而且D是B,A,object的間接子類。

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

所以issubclass可以這樣簡單的實現:

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

Python的issubclass是內置函數(一般是C實現),實際上要復雜很多,要檢測參數類型,如第一個參數必須是type類型,第二個參數是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是動態類型語言,長久以來使用Duck type(鴨子類型)形式編程,不管對象是什么類型,只要實現了所需要的方法。

現在有了ABCs, 可以用于判斷某個類或者某個對象是不是ABCs的子類或者實例,但這個類并不需要顯示的繼承于ABCs, 因為python內置的ABCs有一種注冊機制可將一個類注冊為它的子類。如上例子的register方法。

還有一種機制是可以定制一個__subclasshook__方法,將某種類型的類認定為子類。

如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的子類, 這個__subclasshook__方法是通過__subclasscheck__方法調用的,這個__subclasscheck__是每一個ABC類都有的方法,在ABCMeta類(其他ABC類都繼承于它)實現。

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

__subclasscheck__會分幾個步驟進行判斷:

  1. 調用__subclasshook__方法,如果有方法定義

  2. 檢查自己是否在待檢測類的__mro__列表里

  3. 遞歸檢查待檢測類是否是在注冊子類(內置_abc_registry列表屬性)

  4. 遞歸檢查待檢測類是否是自己子類的子類

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

相關的CPython實現在: https://github.com/python/cpython/blob/0ccc0f6c7495be9043300e22d8f38e6d65e8884f/Objects/abstract.c#L2223

而基本上isinstance(object, classinfo)方法的實現只需要調用issubclass(type(object), classinfo)

以上是“使用Python實現issubclass的方法”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

龙口市| 仁寿县| 大石桥市| 昌都县| 江川县| 渭源县| 哈密市| 江达县| 五河县| 霍林郭勒市| 策勒县| 莒南县| 彰化县| 额尔古纳市| 赤峰市| 南汇区| 乐陵市| 湘潭市| 成都市| 镇原县| 弥勒县| 佛坪县| 青浦区| 磐石市| 运城市| 河北省| 黄大仙区| 扶风县| 康乐县| 册亨县| 阿克陶县| 巴中市| 上杭县| 曲沃县| 德江县| 南安市| 灵丘县| 许昌市| 财经| 山东省| 贵阳市|