天天看點

python的面向對象系統中object和type之間的關系

Python中所有東西都是對象,比較特殊的是:object和type是python中的兩個源對象,它們是互相依賴對方來定義,不能分割來說,就如同讨論“先有雞還是現有蛋”,一樣讓人蛋疼。

先介紹有兩個黑魔法在後面要用到:

obj.__bases__ 指這個對象的父類,就是說從誰繼承來的。

obj.__class__ 指這個對象的類型,類的類型是type

Python的面向對象系統有兩條線索。

1.繼承關系也就是父類和子類的關系(the subclass-superclass relationship),以object為起點;

所有對象的父類是object,是以object是沒有父類的。

>>> object.__bases__

()

type也是object的子類

>>> issubclass(type, object)

True

>>> type.__bases__

(<class 'object'>,)

2.類型和執行個體之間的關系( the type-instance relationship ),以type為起點。

type是自身的執行個體,或說type(對象object)的class(類型type)是type

>>> isinstance(type, type)

True

>>> type(type)

<class 'type'>

>>> type.__class__

<class 'type'>

就連object都是type的執行個體

>>> isinstance(object, type)

True

最後總結一下:

type是一個比較特殊的類,這裡引出另一概念元類,普通類執行個體化出來一個對象,但是元類執行個體化出來的是一個類,

int、float、str、boolean、tuple、dict、set等内置的資料類型其實也就是内置的類都是type執行個體。

>>> isinstance(int, type)

True

>>> int.__class__

<class 'type'>

>>> 

object是所有對象(包括類對象)的父類,int、float、str、boolean、tuple、dict、set内置類都是object子類。

>>> int.__bases__

(<class 'object'>,)

>>> issubclass(int, object)

True