zoukankan      html  css  js  c++  java
  • 第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的世界。
    欢迎大家批评指正,谢谢大家关注!

  • 相关阅读:
    洛朗级数
    泰勒级数
    中心极限定理
    置信区间公式
    简单随机样本的性质
    极大似然估计
    矩估计法
    摆摊70
    天天去哪吃
    天天和树
  • 原文地址:https://www.cnblogs.com/LaoYuanPython/p/11087680.html
Copyright © 2011-2022 走看看