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
