在学python?type、object、class这些不了解一下吗?
toyiye 2024-09-14 13:33 3 浏览 0 评论
在Python的学习中我们肯定会听到一句话:「python中一切皆对象」。
如果再接着学习下去的话,我们就会接触到Python中的type, object, class等概念。网上也有不少文章阐述了这三者之间的关系,但是在看了大部分文章之后我还是似懂非懂,感觉就像有什么东西卡在了喉咙一直咽下不去一样。
于是为了能让自己晚上顺利吃上饭,我立马对着搜索引擎就是一顿操作,终于赶在外卖小哥打响我电话之前,咽下了这几个如鲠在喉的概念,舒服!
趁着外卖小哥上楼这会,分享下我学习研究后的理解吧。
python中的对象
python作为面向对象的语言之一,符合一切基于面向对象理念的设计。在面向对象的体系中,对象存在着两种关系。
继承关系
简单来说即子类继承于父类,子类拥有其自身及父类的方法和属性,同名的子类方法和属性将会覆盖父类的方法和属性。
语义化的理解栗子为:「蛇」类继承自「爬行动物类」,所以「蛇是一种爬行动物」,英文说「snake is a kind of reptile」。
在python中的继承关系可以简单表示如下:
class?Reptile:
????title?=?'爬行动物'
????def?crawl(self):
????????print(self.title)
class?Snake(Reptile):
????def?crawl_a(self):
????????print(self.title)
p?=?Snake()
p.crawl()??#?爬行动物
p.crawl_a()?#?爬行动物
print(p.title)?#?爬行动物
上面这个栗子中,子类Snake继承了父类Reptile的title属性和crawl方法,使得类B的实例对象b能调用父类的a属性和get方法。
另外,如果要查看一个类(class)的父类,可以使用class_name.__bases__的形式来查看。
Snake.__bases__?#?(<class?'__main__.Reptile'>,)
实例化关系
如果继承关系好比父与子的关系,实例化关系则是一个从抽象到具体的过程。实例是某个类中具体的个体的表示。
语义化的理解栗子为:「小p是一条蛇」,「蛇」是一个分类,「小p」则是这个分类中的一个具体的个体。英文说「小p is an instance of snake」。
class?Snake:
????pass
p?=?Snake()?#?p是Snake类的实例对象
如果想要查看一个对象是由哪个类实例化而来,可以使用type() 或 object_name.__class__来查看。表示对象属于什么类型。
type(p)?#?<class?'__main__.Snake'>?表示对象p是由类Snake实例化而来,p的类型是Snake
p.__class__?#?<class?'__main__.Snake'>?表示对象p是由类Snake实例化而来,p的类型是Snake
探究对象的秘密
有了以上的基础,我们就可以一步一步来探究python中对象潜藏着一些秘密了。嘿嘿嘿~
先看看下面朴而不素的代码:
class?A:
????pass
a?=?A()
print(A.__bases__)?#?(<class?'object'>,)
print(object.__bases__)?#?()
print(type(a))?#?<class?'__main__.A'>
print(type(A))?#?<class?'type'>
print(type(object))?#?<class?'type'>
print(type.__bases__)?#?(<class?'object'>,)
通过上面的很简单的代码,运用一眼洞穿法,我们可以根据每个打印语句的结果得到一些简单的观察结论:
- 如果定义一个类时没有指定继承哪个类,则默认继承object类。
- object类的父类为空,说明object类位于继承关系链的顶端,object类是Python中所有类的父类,可以说object是python中的顶端类。
- 对象a由类A实例化而来,a的类型为A,这个比较容易理解。
- 根据3的观察结果,同样的观察手法运用在类A上,观察到类A是由type这个类实例化而来,类A的类型为type,说明类A是一个类的同时也是一个对象(类A是类type的实例化对象)。这里可能有点晕但是请先接着看下去吧。
- 根据3的观察结果,同样的观察手法运用在顶端类object上,观察到object这个顶端类也是由type这个类实例化而来,类object的类型也为type,也说明object作为一个类的同时也是一个对象。
- 类`type`作为实例化类`A`和类`object`的类,其父类为`object`。
看完上面的这些观察结论,相信有一部分童鞋已经两眼发懵了,什么类A是一个类也是一个对象,object类的类型是type,而type类的父类又是object…blablabla
诶,莫方莫方,俗话说无图言*,这里先来一张图简单表示一下这几者的关系,舒缓一下情绪:
python中type,class,object三者关系图
下面我们就可以开始看图写作文啦~
蓝色箭头由实例对象指向实例化它的类,红色箭头由子类指向父类。值得注意的是,这个图有几个关键的地方:
- 类(如class A, class object)都是由type这个类实例化而来的,即所有类(class)对象的类型都是type
- type这个类也是由type自己实例化而来的(图中type处指向自身的部分),即type类的类型也为type
- type类的父类是object类
有了以上的铺垫,我们可以知道一个最普通的实例对象链是这样子的:
type --实例化--> object --衍生--> class --实例化--> a(具体对象)
这部分都是比较好理解的,但关键的问题是 ———— object类作为type类的父类,怎么会是由type类实例化出来的?还有type类居然是由type自己实例化出来的?这都是什么操作?
个人认为,这两个问题解决了才能更好地理解type、class、object三者的关系。然而要知道为什么python是这样设计的,最好的做法便是去翻他们的源码啦。不过在翻之前,其实已经有一些大佬对python的源码做了解读,通过搜索引擎认真找寻便可找到想要的答案。python的底层是C的实现,下面的源码如果看不懂的话请别在意,因为不妨碍理解。
(⊙o⊙)
我们可以看看在源码中,type类和object类分别是什么:
type类实际上是:
#define?PyVarObject_HEAD_INIT(type,?size)
????1,?type,?size,
PyTypeObject?PyType_Type?=?{
????PyVarObject_HEAD_INIT(&PyType_Type,?0)
????"type",?????????????????????????????????????/*?tp_name?*/
????sizeof(PyHeapTypeObject),???????????????????/*?tp_basicsize?*/
????sizeof(PyMemberDef),????????????????????????/*?tp_itemsize?*/
????0,??????????????????????????????????????????/*?tp_base?*/
????...
}
object类实际上是:
PyTypeObject?PyBaseObject_Type?=?{
????PyVarObject_HEAD_INIT(&PyType_Type,?0)
????"object",???????????????????????????????????/*?tp_name?*/
????sizeof(PyObject),???????????????????????????/*?tp_basicsize?*/
????0,??????????????????????????????????????????/*?tp_itemsize?*/
????0,??????????????????????????????????????????/*?tp_base?*/
????...
}
这两个类结构体中的各项的具体含义这里不做深究,因为不在本文研究范围内。我们只需要关注这两个结构中的第一行:
PyVarObject_HEAD_INIT(&PyType_Type, 0)
它表示这个类结构的对象类型。能看出来object 类 和 type 类的对象类型都是 &PyType_Type,而 PyType_Type 正是底层表示type类的结构体!
这两个结构体就说明了:
object类将类型(即谁实例化了这个类)设置成了type类,type类将类型设置成了自己!这其实是python底层实现的一个小小的trick~
然后在type类的初始化过程中,执行了如下代码:
type->tp_base?=?&PyBaseObject_Type;
转换成python为
type.__base__?=?(object,)?
表示将object类指定为type类的父类,这不就是第二个问题的答案所在吗?
源码看到这里,前面的两个问题就已经全部解决了,我们可以开始全面总结一下type,class,object的关系了。
总结
type,class,object三者关系:
- object类是所有类(class)的父类,包括type类,object类的父类为空。
- type类是所有类的类型,即为所有类(class)都可由type实例化而来,包括type类自己。
将上面的关系总结成一张图就是:
pyhton三者关系全
后记&引用
写到这里,python中这三者的关系探究就差不多了,只能说技术写作不是一件容易的事情,前后改了不少东西还是不那么让自己满意,但是已经按照自己的意思给表述出来了,希望之后能写得更顺手一些。话说外卖小哥已经在门口等了我5分钟了,写文章死了那么多脑细胞,胃口一定不错吧哈哈。
参考文章:
- 详解Python中的type和object
- Python 的 type 和 object 之间是怎么一种关系?
- 在 Python 中,为什么 type 类对象自身的类型是 type?
读后三连??
如果你觉得这篇内容对你有帮助,我想邀请你帮我三个小忙:
- 点赞,让更多的人也能看到这篇内容(这对我真的很重要)
- 关注公众号「py一下」,不定期分享原创知识,python/后端/业务/数据结构与算法等
- 也多看看其他文章
相关推荐
- 为何越来越多的编程语言使用JSON(为什么编程)
-
JSON是JavascriptObjectNotation的缩写,意思是Javascript对象表示法,是一种易于人类阅读和对编程友好的文本数据传递方法,是JavaScript语言规范定义的一个子...
- 何时在数据库中使用 JSON(数据库用json格式存储)
-
在本文中,您将了解何时应考虑将JSON数据类型添加到表中以及何时应避免使用它们。每天?分享?最新?软件?开发?,Devops,敏捷?,测试?以及?项目?管理?最新?,最热门?的?文章?,每天?花?...
- MySQL 从零开始:05 数据类型(mysql数据类型有哪些,并举例)
-
前面的讲解中已经接触到了表的创建,表的创建是对字段的声明,比如:上述语句声明了字段的名称、类型、所占空间、默认值和是否可以为空等信息。其中的int、varchar、char和decimal都...
- JSON对象花样进阶(json格式对象)
-
一、引言在现代Web开发中,JSON(JavaScriptObjectNotation)已经成为数据交换的标准格式。无论是从前端向后端发送数据,还是从后端接收数据,JSON都是不可或缺的一部分。...
- 深入理解 JSON 和 Form-data(json和formdata提交区别)
-
在讨论现代网络开发与API设计的语境下,理解客户端和服务器间如何有效且可靠地交换数据变得尤为关键。这里,特别值得关注的是两种主流数据格式:...
- JSON 语法(json 语法 priority)
-
JSON语法是JavaScript语法的子集。JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔花括号保存对象方括号保存数组JS...
- JSON语法详解(json的语法规则)
-
JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔大括号保存对象中括号保存数组注意:json的key是字符串,且必须是双引号,不能是单引号...
- MySQL JSON数据类型操作(mysql的json)
-
概述mysql自5.7.8版本开始,就支持了json结构的数据存储和查询,这表明了mysql也在不断的学习和增加nosql数据库的有点。但mysql毕竟是关系型数据库,在处理json这种非结构化的数据...
- JSON的数据模式(json数据格式示例)
-
像XML模式一样,JSON数据格式也有Schema,这是一个基于JSON格式的规范。JSON模式也以JSON格式编写。它用于验证JSON数据。JSON模式示例以下代码显示了基本的JSON模式。{"...
- 前端学习——JSON格式详解(后端json格式)
-
JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScriptProgrammingLa...
- 什么是 JSON:详解 JSON 及其优势(什么叫json)
-
现在程序员还有谁不知道JSON吗?无论对于前端还是后端,JSON都是一种常见的数据格式。那么JSON到底是什么呢?JSON的定义...
- PostgreSQL JSON 类型:处理结构化数据
-
PostgreSQL提供JSON类型,以存储结构化数据。JSON是一种开放的数据格式,可用于存储各种类型的值。什么是JSON类型?JSON类型表示JSON(JavaScriptO...
- JavaScript:JSON、三种包装类(javascript 包)
-
JOSN:我们希望可以将一个对象在不同的语言中进行传递,以达到通信的目的,最佳方式就是将一个对象转换为字符串的形式JSON(JavaScriptObjectNotation)-JS的对象表示法...
- Python数据分析 只要1分钟 教你玩转JSON 全程干货
-
Json简介:Json,全名JavaScriptObjectNotation,JSON(JavaScriptObjectNotation(记号、标记))是一种轻量级的数据交换格式。它基于J...
- 比较一下JSON与XML两种数据格式?(json和xml哪个好)
-
JSON(JavaScriptObjectNotation)和XML(eXtensibleMarkupLanguage)是在日常开发中比较常用的两种数据格式,它们主要的作用就是用来进行数据的传...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- r语言矩阵 (127)
- browsererror (114)
- exportexcel (119)
- cv2.bitwise_not (137)
- dump命令 (128)
- es6concat (126)
- heapify (127)
- java.security.egd (130)
- javax.annotation (117)
- jsstringsplit (117)
- js数字 (115)
- maven编译 (132)
- mysqlleft (128)
- nodejsbuffer (149)
- org.apache.commons.httpclient (126)
- org.jsoup (141)
- org.springframework.web (128)
- robotframework-ride (115)
- setnocounton (141)
- socket.gethostbyname (122)
- sqlmid (121)
- time.strptime (133)
- vscode格式化 (125)
- win32con (129)
- window.localstorage (126)