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

上节介绍了__new__()方法这个比构造方法还重要的方法的语法,本节通过案例来详细剖析__new__()方法的细节以及它与构造方法之间的关系。
一、    案例说明
本节以圆Cir类为例来说明,为了说明问题只定义基本的类信息,只包含一个成员半径radius,两个方法,就是__new__()方法和构造方法__init__()方法。
为了方便查看信息,我们将相关参数及返回值的信息输出。
二、    案例代码
1.    类定义

class Cir():
   def __new__(cls,*args,**kwargs):
        #看看Python传递给__new__的参数
       print("Python传递给__new__的参数:
***cls: ",cls,"
***args: ",args,"
***kwargs:",kwargs)
       inst = super().__new__(cls)
       print("__new__返回值:",inst)
       return inst
        
   def __init__(self,radius): 
       print("In init,self的值为:",self,", radius的值为:",radius)
           self.radius = radius


2.    类实例创建及信息查看(交互模式执行)

c=Cir(10)
c #查看c的数据
Cir #查看类的数据

3.    案例截屏及解读


 
从上面截图可以看出以下三点:
1)    __new__方法在__init__方法前执行;
2)    从上图中红笔标记的地方可以看出,__new__中调用父类__new__方法返回的实例inst与init的self值、以及实例创建后c的值指向地址是同一个,表明三者是一个,并且是由父类__new__方法返回;
3)    从上图中黄色标记部分,可以看到__new__方法的参数cls就是Cir对应的类。

本节通过案例介绍了__new__()方法和__init__方法之间的部分关系,总结如下:
1.    __new__方法在__init__方法前执行,__new__方法执行后才返回实例对象,也就是说__new__方法执行前实例并未创建,构造方法中的参数self是__new__方法执行后传递过去的实例;
2.    __new__方法的参数是由Python自动传递的,其参数包括创建实例时的“类名”对应类、以及创建创建实例传入的所有参数。
老猿Python(https://blog.csdn.net/LaoYuanPython)系列文章用于逐步介绍老猿学习Python后总结的学习经验,这些经验有助于没有接触过Python的程序员可以很容易地进入Python的世界。
欢迎大家批评指正,谢谢大家关注!

原文地址:https://www.cnblogs.com/LaoYuanPython/p/11087680.html