第8.8节 Python使用__new__方法和构造方法__init__完成类实例化的过程详解

前面章节介绍了Python类中的__new__方法和构造方法__init__,并通过实例分析了二者之间关系,本节系统化的总结一下Python中类实例化过程。具体步骤如下:

一、 开发者通过对象构造器表达式“实例对象=类(参数列表)”启动创建新的实例的任务;

二、 Python查找类的__new__方法

Python首先在准备实例化的类中找new__方法,如果对应类没有__new__方法则从直接父类中查找,如果从直接父类中查找也没有,再找直接父类的直接父类,依此类推,一直到查到一个__new__方法为止(如果自定义类没有,则会找到所有类的父类object类的__new__方法)。

三、 Python传递参数给类的__new__方法

Python找到类对应的__ new__方法后,将对象构造器表达式中的类以及参数列表传给查找到的__new__方法(如果是object类的__new__方法,是否只传自定义类的类名还是参数都传参老猿尚未确认)作为参数,并执行该方法的代码;

  1. __new__方法在应用通过对象构造器表达式触发时至少要有一个参数cls,代表要实例化的类对象,此参数在实例化时由Python解释器自动提供;
  2. 常规情况下,__new__方法执行时,除了object类的__new__方法,所有类中重写的__new__方法都必须调用其父类的__new__方法,并在调用时将本方法中的第一个实参cls传给父类的__new__方法作为第一个参数;
  3. 自定义类的__new__方法调用传入的cls,除了逐层传入外,也可以进行调整,在某些情况下,根据应用需要可以将cls参数对应实参修改为其他类;
  4. 在上述调用层级中,object类的__new__方法一定是最后调用的一个;
  5. 每个自定义类的__new__()方法不能在该方法内调用自身的__new__()来制造实例,必须调用父类的方法,否则会造成死循环。

    四、 __new__方法返回实例对象

    object类的__new__最先返回一个参数cls对应的实例给调用其的自定义子类,自定义子类__new__方法根据情况继续返回给其调用子类的__new__方法,直到返回给对象构造器表达式的调用方。

    所有父类执行__new__方法后必须向子类返回一个实例对象,该实例对象常规情况下是__new__方法第一个参数cls对应的“类”实例,子类再将该实例返回给其调用者,直到传递回给最开始的调用者即“对象构造器表达式”对应的应用;
  6. 由于自定义类的__new__方法调用传入的cls可以修改,上层自定义类的__new__方法也可以改变返回值的值和类型,因此有可能返回的实例不一定是“对象构造器表达式”对应的“类”;
  7. 使用__new__()方法改变返回的实例类型主要是为了允许不可变类型(如int, str, tuple)的子类定制实例,还有就是实现自定义的metaclass。关于metaclass(元类)的内容老猿还没深入研究,暂不介绍。

五、 Python判断__new__方法返回实例对象是否是对象构造器表达式中”类”cls的实例,如果不是则不会调用任何类的构造方法(即使是父类的实例也不行),直接将实例返回给对象构造器表达式的调用方,否则转下步;

  1. 关于这点,老猿验证了几种情况是都不会执行任何类的构造方法,但在网上一些资料查阅的情况,有说可以执行返回实例对应类的构造方法的,老猿没有碰到这种情况,但也许真有这种情况,或许需要特定条件才会触发,因此将这个疑点在此记录下来。

    六、 __new__方法执行完成后,如果返回的实例是cls类的实例,则将此实例作为self传递给构造方法,并将__new__方法中除cls外的参数也传给构造方法;

    七、 执行构造方法,构造方法执行后将实例返回给在对象构造器表达式左侧的”实例对象”,完成整个类的实例化过程。

老猿Python系列文章用于逐步介绍老猿学习Python后总结的学习经验,这些经验有助于没有接触过Python的程序员可以很容易地进入Python的世界。

欢迎大家批评指正,谢谢大家关注!

第8.8节 Python使用__new__方法和构造方法__init__完成类实例化的过程详解的更多相关文章

  1. 第8.5节 Python类中的__new__方法和构造方法__init__关系深入剖析:执行顺序及参数关系案例详解

    上节介绍了__new__()方法这个比构造方法还重要的方法的语法,本节通过案例来详细剖析__new__()方法的细节以及它与构造方法之间的关系. 一.    案例说明 本节以圆Cir类为例来说明,为了 ...

  2. [Python] Python 之 __new__() 方法与实例化

    __new__() 是在新式类中新出现的方法,它作用在构造方法建造实例之前,可以这么理解,在 Python 中存在于类里面的构造方法 __init__() 负责将类的实例化,而在 __init__() ...

  3. Python 之 __new__() 方法与实例化

    原文链接:https://www.cnblogs.com/ifantastic/p/3175735.html __new__() 是在新式类中新出现的方法,它作用在构造方法建造实例之前,可以这么理解, ...

  4. Python 之 __new__() 方法与实例化(转)

    _new__() 是在新式类中新出现的方法,它作用在构造方法建造实例之前,可以这么理解,在 Python 中存在于类里面的构造方法 __init__() 负责将类的实例化,而在 __init__() ...

  5. python的__new__方法

    https://www.cnblogs.com/kex1n/p/5991249.html https://blog.csdn.net/wwx890208/article/details/8053445 ...

  6. 【python】Python 之 __new__() 方法与实例化

    本文转自:http://www.cnblogs.com/ifantastic/p/3175735.html __new__() 是在新式类中新出现的方法,它作用在构造方法建造实例之前,可以这么理解,在 ...

  7. Python 的 __new__()方法与实例化

    __new__() 是新式类中才有的方法,它执行在构造方法创建实例之前.可以这么理解,在 Python 中类中的构造方法 __init__() 负责将类实例化,而在 __init__() 启动之前,_ ...

  8. [Python]python面向对象 __new__方法及单例设计

    __new__ 方法 使用 类名() 创建对象时,Python 的解释器 首先 会 调用 __new__ 方法为对象 分配空间 __new__ 是一个 由 object 基类提供的 内置的静态方法,主 ...

  9. Python中__new__方法为什么有人说是构造方法?有什么作用?

    __new__方法是Python新式类引入的,通常用于控制生成一个新实例的过程.它是类级别的静态方法,是在创建实例对象前执行,如果自定义类中没有重写该方法,则Python自动调用父类的方法,当所有父类 ...

随机推荐

  1. 三分钟快速解析GraphQL基本工作思路!

    欢迎阅读 本文会通过实际场景介绍一下 GraphQL,目的是让你快速了解 GraphQL 是什么,以及基本工作思路,不包含实际用法,所以阅读很轻松. 一.GraphQL 是什么? GraphQL 是后 ...

  2. 01MySQL数据库介绍

    一.数据库基本介绍 目标:了解数据库的功能和常见数据库分类.数据库产品 数据库基本知识 数据库分类 SQL简介 MySQL访问 1.数据库基本知识 目标:了解数据库的概念和数据库的作用 概念 数据库: ...

  3. C# Span 源码解读和应用实践

    一:背景 1. 讲故事 这两天工作上太忙没有及时持续的文章产出,和大家说声抱歉,前几天群里一个朋友在问什么时候可以产出 Span 的下一篇,哈哈,这就来啦!读过上一篇的朋友应该都知道 Span 统一了 ...

  4. Vue3.0初体验

    最近看了Vue3.0的相关信息,相比Vue2.0有以下优点: Performance:性能更比Vue 2.0强. Tree shaking support:可以将无用模块"剪辑", ...

  5. awk1

    awk [选项参数] 'script' var=value file(s)或aawk [选项参数] -f scriptfile var=value file(s)项参数说明:-F fs or --fi ...

  6. c++中的几种函数调用约定(转)

    C++中的函数调用约定(调用惯例)主要针对三个问题: 1.参数传递的方式(是否采用寄存器传递参数.采用哪个寄存器传递参数.参数压桟的顺序等): 参数的传递方式,最常见的是通过栈传递.函数的调用方将参数 ...

  7. python3中的os.path模块

    os.path模块主要用于获取文件的属性,这里对该模块中一些常用的函数做些记录. os.abspath(path):获取文件的绝对路径.这里path指的是路径,例如我这里输入"data.cs ...

  8. 一:JavaWeb

    1.javaWeb技术体系 2.HTMl 超文本标记语言 (超文本的意思就是除了可以包含文字之外,还可以包含图片链接音乐视频等...) 2.1 HTML网页的组成  (结构:HTML 表现:CSS 行 ...

  9. Vmware Tools is currently being installed on your system

    问题描述: 使用虚拟机安装Ubuntu过程中一直停留在"PLEASE WAIT! Vmware Tools is currently being installed on your syst ...

  10. 画echart图时,安卓手机正常,苹果手机上tooltip 在坐标轴下一层

    问题: 解决: 在tooltip 中添加如下代码: tooltip:{ position:function(point, params , dom, rect, size){ dom.style.tr ...