Python - object與type,繼承與類型

1. 概述

在Python的世界中,object是父子關(guān)系的頂端,所有的數(shù)據(jù)類型的父類都是它;type是類型實例關(guān)系的頂端,所有對象都是它的實例。
它們兩個的關(guān)系可以這樣描述:

  • object是一個type,object is an instance of type,即object是type的一個實例。
>>> object.__class__
<type 'type'>
>>> object.__bases__ # object 無父類,因為它是鏈條頂端。
()
  • type是一種object, type is a kind of object,即type是object的子類。
>>> type.__bases__
(<type 'object'>,)
>>> type.__class__ # type的類型是自己
<type 'type'>

object和type的關(guān)系很像雞和蛋的關(guān)系,先有object還是先有type沒法說,obejct和type是共生的關(guān)系,必須同時出現(xiàn)的

type,所有class都是由type創(chuàng)建,繼承type的class稱之為元類metaclass,可稱為:萬類之母
object,所有class的基類,即所有class繼承于object,可稱為:萬類之父

2. 父類與母類

繼承與類型

  • 第一列是元類metaclass
  • 第二列是object列,即類的定義,包含__bases____class_
  • 第三列是類的實例


    藍色表示繼承,紅色表示類型

直接父類__bases__,即繼承于誰

Python 為所有類都提供了一個__bases__屬性,通過該屬性可以查看該類的所有直接父類,該屬性返回所有直接父類組成的元組

class M(type):
    pass
class A(metaclass=M):
    pass
class B:
    pass
class C(A, B):
    pass

print('類A的所有父類:', A.__bases__)
print('類B的所有父類:', B.__bases__)
print('類C的所有父類:', C.__bases__)
類A的所有父類: (<class 'object'>,)
類B的所有父類: (<class 'object'>,)
類C的所有父類: (<class '__main__.A'>, <class '__main__.B'>)

直接母類__class__,即誰創(chuàng)造了它

class M(type):
    pass
class A(metaclass=M):
    pass
class B:
    pass
class C(A, B):
    pass

print(A.__class__)
print(B.__class__)
print(C.__class__)

print(A().__class__)
print(B().__class__)
print(C().__class__)
<class '__main__.M'>
<class 'type'>
<class '__main__.M'>
<class '__main__.A'>
<class '__main__.B'>
<class '__main__.C'>

3. 三個常用的類型檢查函數(shù)

  • isinstance(obj, class_or_tuple):檢查 obj 是否為后一個類或元組包含的多個類中任意類的對象
  • issubclass(cls, class_or_tuple):檢查 cls 是否為后一個類或元組包含的多個類中任意類的子類
  • type(obj):返回object的類型
>>> class A: pass
... 
>>> class B(A): pass
... 
>>> type(A())
<class '__main__.A'>
>>> type(A()) == A
True
>>> type(B()) == B
True
>>> isinstance(B(), B)
True
>>> isinstance(B(), A)
True
>>> isinstance(A(), A)
True
>>> isinstance(A(), B)
False
>>> issubclass(A, B)
False
>>> issubclass(B, A)
True
>>> issubclass(B, B)
True
>>> issubclass(B, type)
False     <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
>>> issubclass(B, object)
True

>>> isinstance(B, type)
True        <<<<<<<<<<<<<<<<<<<<<<<<< B是type創(chuàng)建的,所以True
>>> isinstance(B(), type)
False      <<<<<<<<<<<<<<<<<<<<<<<<< B的實例不是type創(chuàng)建的,所以False
>>> isinstance(B, object)
True
>>> isinstance(B(), object)
True
  • 類型,type
>>> type(str)
<class 'type'>
>>> type('xxx')
<class 'str'>

>>> type(list)
<class 'type'>
>>> type([1,2,3])
<class 'list'>
  • 實例,isinstance
>>> isinstance(int, object)
True
>>> isinstance(str, object)
True
>>> isinstance(list, object)
True
>>> isinstance(type, object)
True
>>> isinstance(object, object)
True

>>> isinstance(str, type)
True
>>> isinstance(list, type)
True
>>> isinstance(int, type)
True
>>> isinstance(object, type)
True
>>> isinstance(type, type)
True
  • 子類,issubclass
>>> issubclass(str, object)
True
>>> issubclass(int, object)
True
>>> issubclass(list, object)
True
>>> issubclass(dict, object)
True
>>> issubclass(type, object)
True
>>> issubclass(object, object)
True
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容