Python type 与 __bases__

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 

 

最后,我们可以整理出一幅这样的图

 

 

 

 
posted @ 2017-05-20 21:33  Haichao_cn_blog  阅读(611)  评论(0编辑  收藏  举报