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

 更新时间:2023年06月02日 15:02:35   作者:会振刀的程序员  
本文主要介绍了深度理解Python中Class类、Object类、Type元类,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

提要:作为普通的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:是典型的面对对象编程的表现形式,为定义对象的属性、行为提供了一个模板。其实说白了就是用来写业务的

  • object:Python2中,创建类需要显示声明object方法才会继承,若不声明,则不继承。这里我们不再过多讨论Python2。在Python3中,已经隐式的自动继承了object方法,所以我们平时编写的class默认类方法其实是由object方法提供的,Python3中任何一个类都默认集成了Object,不可改变。我们通过下图看看object类到底有多少内置函数,分别是谁?并将解析他们中主要成员。

1.1关系详解

object、type:本文的核心之一就是阐述object与type的关系。
1、上述有一个比较绕的逻辑是object类是type的父类,而object类是type实例化而来,我想了很久怎么去解释和阐述这个逻辑,发现其实从Python的层面来讲已经解释不清了,于是翻到了C的源码,又查了很多资料,翻了很多博客。这里我想结合所有所得总结一些信息:不用去深究object和type的深度关系是什么,除非你想去看完C的PyObject部分,我相信对绝大多数人来讲结果一定是戛然而止的。那么我们只需要知道type的父类是object,object的类型是type便好。

2、那么如何看待object、type在Python面对对象概念中的一席之地呢?这里引用这位博主的一句话。
可以把二者理解为是两个体系的王者,object是站在继承关系顶点的存在,所有的类最后都是继承自object的,object没有父类了,所以这里输出为空(),object是type类型的,也就是说type是站在类型关系顶端的存在,所有的类型都难逃type类型的掌握,所以object和type自己的类型都是type,type的父类是object

3.Object类的默认方法作用详解

前言提要:默认类方法是从何而来呢!Python2中,创建类需要显示声明Object方法才会继承,若不声明,则不继承;Python3中,已经隐式的自动继承了Object方法。所以我们平时编写的class默认类方法其实是有object方法提供的,Python3中任何一个类都默认集成了Object,不可改变。我们通过下图看看object类到底有多少内置函数,分别是谁?并将解析他们中主要成员。

print(list(object.__dict__.keys()))

3.1 init

详解:构造方法,这是从其他语言借鉴过来的术语。作用:当类实例被创造后调用的方法,所以更严格来讲应叫做 初始化方法,而不是构造方法。但通常很多同学会把它叫做构造方法,其实是不对的,因为Python中的构造方法另有其人,它就是new方法。

3.2 new

详解:用于构建实例的特殊方法。关于这个方法咱不用再进一步深究,除非你想去看看CPython源码。它返回一个实例,这个实例会作为第一个参数(即self)传给init方法,所以init方法的第一个self参数其实是这样得到的,而new便是真正构造类实例的方法。通常我们几乎不需要自己编写new方法,因为从object类集成的实现已经足够了。

3.3 repr

详解:__repr__()会返回和调用者有关的“类名+object at+内存地址”。所以我们在执行类的实例化之后返回了一个实例实际上就是调用了repr函数。当然它从道理上来讲也可以重写,但是建议最好不要动它,因为确实没有什么重写的必要。还是那句话,所有的动作皆为业务而生,反之就不要产生动作。

3.4

  • isinstance
  • issubclass
  • 论述 继承与类型 的关系
  • type.new方法创建实例

到此这篇关于深度理解Python中Class类、Object类、Type元类的文章就介绍到这了,更多相关Python Class类 Object类 Type元类内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Appium+python自动化之连接模拟器并启动淘宝APP(超详解)

    Appium+python自动化之连接模拟器并启动淘宝APP(超详解)

    这篇文章主要介绍了Appium+python自动化之 连接模拟器并启动淘宝APP(超详解)本文以淘宝app为例,通过实例代码给大家介绍的非常详细,需要的朋友可以参考下
    2019-06-06
  • python中start和run方法的区别

    python中start和run方法的区别

    大家好,本篇文章主要讲的是python中start和run方法的区别,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下
    2022-02-02
  • 用Python Flask创建简洁高效的URL短链接服务

    用Python Flask创建简洁高效的URL短链接服务

    本文介绍了如何使用Python Flask框架创建URL短链接服务。通过详细的步骤和代码示例,读者将学会如何搭建一个高效的URL缩短服务,包括生成短链接、重定向、还原长链接等功能。本文还介绍了如何使用Redis数据库实现短链接的存储和管理和如何优化短链接的访问速度和可靠性
    2023-04-04
  • Python之Numpy 常用函数总结

    Python之Numpy 常用函数总结

    这篇文章主要介绍了Python之Numpy 常用函数总结,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-07-07
  • python基于 Web 实现 m3u8 视频播放的实例

    python基于 Web 实现 m3u8 视频播放的实例

    这篇文章主要介绍了python基于 Web 实现 m3u8 视频播放的实例的相关资料,需要的朋友可以参考下
    2023-06-06
  • OpenCV半小时掌握基本操作之直线检测

    OpenCV半小时掌握基本操作之直线检测

    这篇文章主要介绍了OpenCV基本操作之直线检测,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-09-09
  • python人人网登录应用实例

    python人人网登录应用实例

    这篇文章主要介绍了python人人网登录应用实例,是一个非常实用的技巧,需要的朋友可以参考下
    2014-09-09
  • python爬取豆瓣评论制作词云代码

    python爬取豆瓣评论制作词云代码

    大家好,本篇文章主要讲的是python爬取豆瓣评论制作词云代码,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下,方便下次浏览
    2022-01-01
  • python爬虫之线程池和进程池功能与用法详解

    python爬虫之线程池和进程池功能与用法详解

    这篇文章主要介绍了python爬虫之线程池和进程池功能与用法,结合实例形式分析了Python基于线程池与进程池的爬虫功能相关操作技巧与使用注意事项,需要的朋友可以参考下
    2018-08-08
  • PyCharm搭建Spark开发环境实现第一个pyspark程序

    PyCharm搭建Spark开发环境实现第一个pyspark程序

    这篇文章主要介绍了PyCharm搭建Spark开发环境实现第一个pyspark程序,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-06-06

最新评论