【Python】深度理解Class类、Object类、Type元类的概念和关系

news2024/11/16 7:50:57

深度理解Class类、Object类、Type元类

      • 1.Class类、Object类、Type元类的表面关系
      • 2.Class、Object、Type解释
      • 3.关系详解
      • 4.那么如何看待object、type在Python面对对象概念中的一席之地呢?
      • 5.那么object、type扮演了什么样的角色呢?他们对class又分别做了什么哪些动作?
      • 6.Python在代码层面也提供了一些方法去判断继承和类型
      • 总结:从事务看本质

提要:作为普通的Python开发者来讲,深入理解object、type不是必要的,但了解他们确实会有所帮助的。本篇文章的本意是为了元编程打理论基础,但我相信无论是否元编程,本章也将大有裨益。

1.Class类、Object类、Type元类的表面关系

  • object:object类是所有类(class)的父类,包括type类,object类的父类为空
  • type:type类是所有类的类型,即为所有类(class)都可由type实例化而来,包括type类和父类object。
  • class:继承自object,同时,由type进行实例化。其中,type就是我们所讲的元类(metaclass)
print('type的父类是:',type.__base__)

class test:
    pass
print('class的父类是:',test.__base__)

print('object的父类是:',object.__base__)

在这里插入图片描述

2.Class、Object、Type解释

  • class:是典型的面对对象编程的表现形式,为定义对象的属性、行为提供了一个模板。更多的使用场景还是在后台需要个体实例的情况下;一般的model层开发,几乎还是用的函数编程。
  • object:Python3中所有class的顶级父类,在class编程中,隐式的自动继承object,object类为其提供了一些内置函数。在我们Python3的开发中,已经不需要去关注object类。
print(list(object.__dict__.keys()))

在这里插入图片描述

  • type:type是所有对象的顶级类型。在class编程中,隐式的默认声明metaclass=type。

3.关系详解

  • class 与 object的关系:
    在Python3中,已经隐式的自动继承了object方法,所以我们平时编写的class的的默认内置方法其实是由object方法提供的,Python3中任何一个类都默认继承了Object,是不可改变的。并且每个class的顶级父类都是object。
  • class 与 type的关系:
    在Python3中,已经隐式的默认了元类是type类,所以每个class的顶级类型都是type类
  • object、type:本文的核心之一就是阐述object与type的关系。
    上述有一个比较绕的逻辑是object类是type的父类,而object类是type实例化而来,我想了很久怎么去解释和阐述这个逻辑,发现其实从Python的层面来讲已经解释不清了,于是翻到了C的源码,又查了很多资料,翻了很多博客。这里我想结合所有所得总结一些信息:不用去深究object和type的深度关系是什么,除非你想去看完C的PyObject部分,我相信对绝大多数人来讲结果一定是戛然而止的。那么我们只需要知道type的父类是object,object的类型是type便好;也就是我上面说的所有类的顶级类型是type,所有类的顶级父类是object。所以,他们之间与其说是有所关系,不如说是相互协作。下面我会详解他们是如何协作的

4.那么如何看待object、type在Python面对对象概念中的一席之地呢?

这里引用这位博主的一句话。
可以把二者理解为是两个体系的王者,object是站在继承关系顶点的存在,所有的类最后都是继承自object的,object没有父类了,所以这里输出为空(),object是type类型的,也就是说type是站在类型关系顶端的存在,所有的类型都难逃type类型的掌握,所以object和type自己的类型都是type,type的父类是object。
我个人觉得这样的解释也算合理,对普通的开发人员而言已经足够。但如果你想做更加高级的动作,一定要看看下文;皆在我对继承、类型和抽象的理解。

5.那么object、type扮演了什么样的角色呢?他们对class又分别做了什么哪些动作?

object让类有了可以代代相传的通道,可以继承和实例化延续下去,它延续了一个技能,就需要元类,元类里面可以定制类的行为,比如重写__new__或者__init__等方法,就像基因编辑一样,制造出一个按照我们要求工作的娃娃。。
与其说object、type扮演了什么角色,不如讲什么是继承,什么是类型。事实上,Python对此的命名和抽象非常有水平,我想换一种类比去解释这个概念,这里的继承和类型放在中华概念中可以解释为 行为传承和物种生成(通俗点说,就是你向谁学东西,谁创造了你)(在此不得不惊叹guido对Python的审美已经到了极其优雅的程度,让人叹为观止),行为传承让成型的物种有了可以将技能代代相传的通道。那么成型的物种怎么理解呢:既然是物种,那么总有个发育和成型的过程吧。而type就是用来控制这个发育过程的直到它物种成型,然后继承行为,所以从执行顺序上讲object是在type之后。那么type在代码层面又是如何做的呢?我们从下面这个例子看一下:

class MyMeta(type):
 
    def __new__(cls, *args, **kwargs):
        print("元类中的__new__被调用")
        return super(MyMeta, cls).__new__(cls, *args, **kwargs)
    
    def __init__(self, *args, **kwargs):
        print("元类中的__init__被调用")
        return super(MyMeta, self).__init__(*args, **kwargs)
    
    def __call__(self, *args, **kwargs):
        print("元类中的__call__被调用")
        return super(MyMeta, self).__call__(*args, **kwargs)
 
class MyClass(metaclass=MyMeta):
    def __new__(cls, *args, **kwargs):
        print("主类中的__new__被调用")
        return super(MyClass, cls).__new__(cls, *args, **kwargs)
    
    def __init__(self, *args, **kwargs):
        print("主类中的__init__被调用")
        return super(MyClass, self).__init__(*args, **kwargs)
    
    def __call__(self, *args, **kwargs):
        print("主类中的__call__被调用")
        return super(MyClass, self).__call__(*args, **kwargs)
 
print("-------------------------\n创建具体的对象前\n----------------------------------")
m = MyClass()
元类中的__new__被调用
元类中的__init__被调用
-------------------------
创建具体的对象前
----------------------------------
元类中的__call__被调用
主类中的__new__被调用
主类中的__init__被调用

相信上图已经非常明了。在MyClass代码被加载进内存的时候就已经执行了元类的相关函数,这个过程其实就是物种发育成型。所以在我们平时的普通开发中,几乎都是基于物种发育成型后赋予相关技能行为的代码编写。而这种控制物种发育的过程,在Python代码层面叫做元编程。
执行顺序:
元类:new、init、call、 子类new、init、call。注意每个函数的第一个参数都是由上一个函数执行的返回结果,new的第一个参数是外部返回的结果,声明cls,其他函数的第一个参数是内部函数返回的结果声明为self,这种命名是guido做的一种范式,这样的命名设计是合理的。

6.Python在代码层面也提供了一些方法去判断继承和类型

提供了内置函数isinstance去比较类型关系;
提供了内置函数issubclass去比较继承关系;
提供了type()去判断类型;
提供了对象的__base__()方法去获取上一级的父类

总结:从事务看本质

object和type的产生本身就是一种自然抽象。其实从汇编、C、面向过程、面向对象这一路演化都是为了抽象,包括造轮子,语言生态,其实都是抽象的具体表现。那么殊途同归,从硬件到软件一路走来,所有动作都是抽象,它不是创造,而是优化,但某些优化趋近于创造。软件设计思想,其实都是从自然、人文等关系演化类比而来。软件思想就是一方世界,是自然的产生,是真实世界的映射,它和我们一样,在进步、在进化,与我们并肩前行。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/612228.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【计算机组成】Cache与CPU的直接映射、全相联映射与组相联映射

一.Cache与CPU需要映射的原因 CPU准备访问内存时,会先问问cache存储器有没有已经提前准备好了数据,如果没有则再找内存要: 如果Cache刚好命中,则直接从Cache中读取数据: 如果Cache没有命中(Cache失效&#…

时序数据库InfluxDB快速入门使用

推荐博客: Influxdb中文文档 linux安装influxdb Influxdb安装、启动influxdb控制台、常用命令、Influx命令使用、Influx-sql使用举例、Influxdb的数据格式、Influxdb客户端工具 1.安装 1、influxdb数据库官网的下载链接: https://portal.influxdata.c…

如何利用MES系统进行生产防呆防错?

一、认识MES系统的防呆防错功能 首先,我们要清楚了解,什么是MES系统的防呆防错。MES系统防呆防错是指利用MES系统来避免生产过程中的错误和缺陷,保障生产排程和生产过程顺利进行的过程。MES系统防呆防错包括以下方面: 1. 自动识别…

relation-graph关系图谱组件2.0版本遇到的问题

前提:之前已经写过一篇1.1版本的问题,这里就不过多讲了(如果想要解决火狐低版本兼容,看那个就行) 这次主要讲的是和1.X版本的区别和一些其它问题 区别 参数名不同:以前的links>lines (虽然现在links也…

遇见未来,降低职场焦虑——中国人民大学与加拿大女王大学金融硕士来助力

身在职场的你有感到一丝丝的焦虑吗?偶尔的小焦虑可以作为我们工作中的动力,时刻提醒我们保持奋进。预见未来才能遇见未来,随着社会经济不断发展,没有什么是一成不变的。处于职场上升期的我们更要懂得未雨绸缪,增加自身…

ClickHouse集群搭建总结

简介 ClickHouse是俄罗斯最大的搜素引擎Yandex于2016年开源的列式数据库管理系统,使用C 语言编写, 主要应用于OLAP场景。 使用理由 在大数据量的情况下,能以很低的延迟返回查询结果。 笔者注: 在单机亿级数据量的场景下可以达到毫秒级的查询…

SpringCloudAlibaba 微服务生态

一 微服务架构 1.1 微服务 微服务其实是一种架构风格,我们在开发一个应用的时候这个应用应该是由一组小型服务组成,每个小型服务都运行在自己的进程内;小服务之间通过HTTP的方式进行互联互通。 1.2 微服务架构的常见问题 一旦采用微服务系…

ChatGPT 之后,B 端产品设计会迎来颠覆式革命吗?| Liga妙谈

近日,脑机接口公司 Neuralink 宣布,其植入式脑机接口设备首次人体临床研究已被准许启动。遥想当年,我们还嘲讽罗老师「动嘴做 PPT」,谁曾想不久后我们可能连嘴都不用动🙊。 脑机接口何时会引爆人机交互革命尚未可知&a…

简述三观;

文章目录 三观世界观人生观价值观三观不合怎么看三观不正: 教养育儿教育心智不成熟的表现 三观 指人生观,世界观和价值观; https://wenku.baidu.com/view/102a655fd4bbfd0a79563c1ec5da50e2534dd1d8.html?fraladdin664466&ind1&_wkts_1685949448098&…

深入理解API网关Kong:动态负载均衡配置

深入理解API网关Kong:动态负载均衡配置 背景 在 NGINX 中,负载均衡的配置主要在 upstream 指令中进行。upstream 指令用于定义一个服务器群组和负载均衡方法。客户端请求在这个服务器群组中进行分发。 NGINX 提供了以下几种负载均衡方法: …

python接口自动化 —— 什么是接口、接口优势、类型(详解)

简介 经常听别人说接口测试,接口测试自动化,但是你对接口,有多少了解和认识,知道什么是接口吗?它是用来做什么的,测试时候要注意什么?坦白的说,笔者之前也不是很清楚。接下来先看一下…

从简历被拒到收割 8 个高薪 offer,我用了 3 个月...

半年前我一个小老弟从外包离职了,本以为有两年经验进个一般的公司没有问题的,结果人家一看是外包出来的,面试问的问题也不是很懂,简历被拒了好几次。还好这个小老弟没有气馁,在论坛博客和里面的大佬虚心学习&#xff0…

地震勘探基础(八)之地震动校正

地震动校正 在地震资料数字处理过程中,速度分析,动校正和水平叠加三个处理内容是相互关联的。水平叠加是为了提高地震资料的信噪比,要想得到好的叠加效果,必须做好动校正。而做好动校正,需要进行准确的速度分析。只有…

Tomcat部署

目录 Tomcat 什么是 servlet? 什么是 JSP? Tomcat 功能组件结构: Container 结构分析: Tomcat 请求过程: ---------------------Tomcat 服务部署------------------------- 1.关闭防火墙,将安装 Tomcat 所需软…

长尾词挖掘,长尾词的优化方法有哪些

我们都知道,长尾词能给我们带来较高的流量和转化率,且优化难度低,成本低。今天就来分享长尾词的优化方法。 首先需要挖掘长尾词,挖掘长尾词的方法以下3种比较实用: 1、使用长尾词挖掘工具 可以通过第三方工…

ROS:tf坐标系广播与监听的编程实现

目录 一、创建功能包二、创建代码并编译运行(C)2.1创建代码2.2编译2.3运行 一、创建功能包 创建的 learning_tf 包来进行代码存放和编译 cd ~/catkin_ws/src catkin_create_pkg learning_tf roscpp rospy tf turtlesim二、创建代码并编译运行&#xff…

银行业务相关

省联社,农商行、农村信用社之间的关系 一些知乎回答 省联社、农商行、农村信用社之间有什么联系? - mobye的回答 - 知乎 https://www.zhihu.com/question/24220844/answer/28276903 发源于空想社会主义,世界上第一个信用合作社诞生于1984年的…

第9章集 合

文章目录 9.1 Java集合框架9.1.1 集合接口与实现分离9.1.3 迭代器9.1.4 泛型实用方法 9.2 集合框架中的接口9.3.1 链表9.3.2 数组列表9.3.3散列集9.3.4 树集9.3.5 队列与双端队列9.3.6 优先队列 9.4 映射9.4.1 基本映射操作9.4.2 更新映射条目9.4.3 映射视图9.4.4 弱散列映射9.…

python数据可视化-matplotlib学习总结

目录 (一)常见的图形 1、趋势图(直线图):plot() 2、散点图:scatter(): (二)统计图形 1、柱状图:bar( 2、条形图:barh() 3、直方图&#xff…

RSA加密算法解析

目录 RSA加密 数学原理 证明: 欧拉函数 欧拉定理 模反元素 模运算 指数运算 同余 欧几里德算法GCD 填充(padding) 对称加密的应用工作流程 非对称加密的应用工作流程 1)加密过程 2)解密过程 代码实现 密码学知识扩展 加密体制 如何破解…