1. 程式人生 > >Python type 與 __bases__

Python type 與 __bases__

src ont tls ces true 模板 href dict enc

type 字面意思是類型,可以理解為模具,通過模具生成各種各樣的實例。 Python中內置函數type()可以查看實例的具體類型。

什麽樣子的類型是type呢 ? 看看下面的例子。


 >>> type(bool)
 <type ‘type‘>

>>> type(str)
<type type>
>>> type(int)
<type type>
>>> type(list)
<type type>
>>> type(dict)
<type 
type> >>> type(set) <type type> >>> type(type) <type type>

可以發現, bool,str,int,list,dict,set都是type類型,而且這些是基本類型。

看一下這些類型的實例:

>>> type(True)
<type bool>
>>> type(False)
<type bool>
>>> type(1234)
<type str>
>>> type([1,2,3,4])
<type list> >>> type({1,2,3,4}) <type set> >>> type({1:a,2:b,3:c,4:d}) <type dict>

還有一種類型叫做class, 它也是一種模板,它的實例叫做Object。

>>> class MyObjectA(object):
...     pass
... 
>>> type(MyObjectA)
<type type>

class 具有繼承關系, 那它的子類又是什麽類型呢 ? Python中所有的class都繼承object, 那object又是什麽類型呢?

>>> class MyObjectSubA(MyObjectA):
...     pass
... 
>>> type(MyObjectSubA)
<type type>
>>> type(object)
<type type>

看來只要是class,類型都是type。 再看看它們的實例化的對象類型

>>> my_object_a = MyObjectA()
>>> type(my_object_a)
<class MyObjectA>
>>> my_object_sub_a = MyObjectSubA()
>>> type(my_object_sub_a)
<class MyObjectSubA>

如果一個object是誰的實例,那它的類型就是誰。

再來看一看__bases__, __bases__ 也是內置函數, 用來查看class的繼承關系。先看看下面多種繼承的關系。

>>> class MyObjectB(object):
...     pass
... 
>>> class MyObjectC(MyObjectA, MyObjectB):
...     pass
... 
>>> MyObjectC.__bases__
(<class MyObjectA>, <class MyObjectB>)

MyObjectC繼承MyObjectA, MyObjectB. 可以看到MyObjectC的__bases__ 就是包含MyObjectA和MyObjectB的一個元組。

可以試下Python tutor

MyObjectA的__bases__是object, 驗證下:

MyObjectA.__bases__
(<type object>,)

那object的__base__是什麽呢?

>>> object.__bases__
()

空的元組。

type的__bases__是什麽呢 ?

>>> type.__bases__
(<type object>,)

object

最後,我們可以整理出一幅這樣的圖

技術分享

Python type 與 __bases__