python3中的type与object

简介: 在python中,一切皆对象,应该怎么理解呢??先来看几个例子:[root@localhost ~]# python3Python 3.6.3rc1 (default, Feb 26 2018, 22:34:25) [GCC 4.

在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源码,也可以验证这个结论
img_a38de4398efb21844699468fd6b8644d.png

img_dda952244055037cb03fa428a1aeeadf.png

img_f635b039ab6639a5b1abb37ddf69e0f6.png

img_2bc0e87b5fc59603947b79f00c1d9eb3.png

img_576b3687fbb6c0f1b0912338490f7387.png

img_9672118d7e9bcf8816ae497487f909d1.png

在前面,已经知道,python所有数据类型的类型都是由type类实例化得到的,那么type类又是由什么实例化而来,type类的基类又是什么呢

>>> type(type)                  # 查看type的类型,结果也是type类
<class 'type'>
>>> type.__bases__              # 查看type的基类,结果为object
(<class 'object'>,)

通过查看源码,可以看到type类是继承自object的

img_4792e95dc06357bc3b0fef139afccae7.png

由此可以知道,type是一个类,同时type也是一个对象

object类是所有类的基类,object类的基类又是什么呢??

>>> type(object)            # 查看object的类型,结果为object类也是由type类实例化而来
<class 'type'>
>>> object.__bases__        # 查看object的基类,结果为object类的基类为空
()

综上所述,object与type和class的关系如下图所示

img_6df5799878498f701925fabfce72840c.png

目录
相关文章
|
1月前
|
Python
[oeasy]python036_数据类型有什么用_type_类型_int_str_查看帮助
本文回顾了Python中`ord()`和`chr()`函数的使用方法,强调了这两个函数互为逆运算:`ord()`通过字符找到对应的序号,`chr()`则通过序号找到对应的字符。文章详细解释了函数参数类型的重要性,即`ord()`需要字符串类型参数,而`chr()`需要整数类型参数。若参数类型错误,则会引发`TypeError`。此外,还介绍了如何使用`type()`函数查询参数类型,并通过示例展示了如何正确使用`ord()`和`chr()`进行转换。最后,强调了在函数调用时正确传递参数类型的重要性。
23 3
|
1月前
|
C++ Python
Python Tricks--- Object Comparisons:“is” vs “==”
Python Tricks--- Object Comparisons:“is” vs “==”
|
1月前
|
Python
通过 type 和 object 之间的关联,进一步分析类型对象
通过 type 和 object 之间的关联,进一步分析类型对象
56 3
|
3月前
|
Docker 容器
成功解决:Caused by: ParsingException[Failed to parse object: expecting token of type [START_OBJECT] but
这篇文章讨论了在使用Docker启动Elasticsearch容器时遇到的一个具体问题:由于配置文件`elasticsearch.yml`解析出错导致容器启动失败。文章提供了详细的排查过程,包括查看容器的日志信息、检查并修正配置文件中的错误(特别是空格问题),并最终成功重新启动了容器。
|
3月前
|
Python
python布尔类型 (Boolean Type)
【8月更文挑战第3天】
64 8
|
3月前
|
Python
【Python】使用LogisticRegression出现错误: invalid type promotion
使用Python中的LogisticRegression时遇到TypeError: invalid type promotion错误的解决方法,指出错误原因是因为输入的DataFrame包含datetime类型的数据,并提供了通过删除datetime字段来解决此问题的步骤。
52 3
|
3月前
|
存储 Python 容器
Python中映射类型 (Mapping Type)
【8月更文挑战第2天】
150 2
|
3月前
|
数据处理 Python
【Python】解决tqdm ‘module‘ object is not callable
在使用tqdm库时遇到的“'module' object is not callable”错误,并给出了正确的导入方式以及一些使用tqdm的常见示例。
117 1
|
3月前
|
JSON 数据格式 Python
【python】解决json.dump(字典)时报错Object of type ‘float32‘ is not JSON serializable
在使用json.dump时遇到的“Object of type ‘float32’ is not JSON serializable”错误的方法,通过自定义一个JSON编码器类来处理NumPy类型的数据。
153 1
|
3月前
|
API C++ Python
【Azure 应用服务】Python fastapi Function在Azure中遇见AttributeError异常(AttributeError: 'AsgiMiddleware' object has no attribute 'handle_async')
【Azure 应用服务】Python fastapi Function在Azure中遇见AttributeError异常(AttributeError: 'AsgiMiddleware' object has no attribute 'handle_async')
下一篇
无影云桌面