python3中的type与object
在python中,一切皆对象,应该怎么理解呢??
先来看几个例子:
[root@localhost ~]# python3
Python 3.6.3rc1 (default, Feb 26 2018, 22:34:25)
[GCC 4.8.5 20150623 (Red Hat 4.8.5-16)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> a = 1 # 定义一个变量,值为1
>>> type(a) # 查看变量a的类型,可以看出变量a是由int类实例而来
<class 'int'>
>>> type(1) # 查看整数1的类型,结果也是由int类实例而来
<class 'int'>
>>> type(int) # 查看int类的类型,得出结论:int类型是由type类实例化而来
<class 'type'>
>>>
>>> str1 = 'aa' # 定义一个变量,值为'aa'字符串
>>> type(str1) # 查看变量str1的类型,可以看出变量str1是由str类实例而来
<class 'str'>
>>> type('aa') # 查看'aa'字符串的类型,结果也是由str类实例而来
<class 'str'>
>>> type(str) # 查看str类的类型,得出结论:str类型是由type类实例化而来
<class 'type'>
>>>
>>> class Goods: # 自定义一个Goods商品类
... pass
...
>>> good1 = Goods() # 实例化Goods类,得到实例化对象good1
>>> type(good1) # 查看good1的类型,可以看到是由Goods类实例化出来的
<class '__main__.Goods'>
>>> type(Goods) # 查看Goods类的类型,得出结论:Goods类是由type类实例化而来的
<class 'type'>
同理,我们也可以使用type方法查看list,tuple,dict,set等数据类型的类型,这些数据类型都是由type类实例化来的
>>> type(list)
<class 'type'>
>>> type(tuple)
<class 'type'>
>>> type(dict)
<class 'type'>
>>> type(set)
<class 'type'>
所以,可以得出结论:
在python3中,所有数据类型的变量都是由对应的类来创建的,而创建数据类型的类都是由type类实例化得到所以,python中所有的数据类型都是type类实例化来的
在上面的例子里,定义一个Goods类,然后根据Goods类实例化good1对象
>>> Goods.__bases__ # 查看Goods类的基类,结果为object类
(<class 'object'>,)
>>> class TestGoods(Goods): # 再定义一个TestGoods类,继承Goods类
... pass
...
>>> TestGoods.__bases__ # 查看TestGoods类的基类,结果显示为Goods类
(<class '__main__.Goods'>,)
所以,在定义类时,如果未指定类所继承的父类,其基类都是object
从上面的例子知道,所有数据类型的变量都是由对应的类来创建的
>>> int.__bases__ # 查看int类的基类,结果为int类是继承自object类的
(<class 'object'>,)
>>> str.__bases__ # 查看str类的基类,结果为str类是继承自object类的
(<class 'object'>,)
>>> tuple.__bases__ # 查看tuple类的基类,结果为tuple类是继承自object类的
(<class 'object'>,)
>>> list.__bases__ # 查看list类的基类,结果为list类是继承自object类的
(<class 'object'>,)
>>> dict.__bases__ # 查看dict类的基类,结果为dict类是继承自object类的
(<class 'object'>,)
>>> set.__bases__ # 查看set类的基类,结果为set类是继承自object类的
(<class 'object'>,)
所以,object是最顶层基类
通过查看python源码,也可以验证这个结论
在前面,已经知道,python所有数据类型的类型都是由type类实例化得到的,那么type类又是由什么实例化而来,type类的基类又是什么呢
>>> type(type) # 查看type的类型,结果也是type类
<class 'type'>
>>> type.__bases__ # 查看type的基类,结果为object
(<class 'object'>,)
通过查看源码,可以看到type类是继承自object的
由此可以知道,type是一个类,同时type也是一个对象
object类是所有类的基类,object类的基类又是什么呢??
>>> type(object) # 查看object的类型,结果为object类也是由type类实例化而来
<class 'type'>
>>> object.__bases__ # 查看object的基类,结果为object类的基类为空
()
综上所述,object与type和class的关系如下图所示