• 第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的世界。
    欢迎大家批评指正,谢谢大家关注!

  • 相关阅读:
    爬取豆瓣分页照片下载
    css布局:三列布局,中间内容优先加载
    解决在IE下label中IMG图片无法选中radio的几个方法
    CSS架构:最新最佳实践
    JavaScript登陆弹窗,可拖拽
    网站变成灰色的代码
    5个jQuery的备选轻量级移动客户端开发(Mobile development)类库
    jQuery 底部漂浮导航当前位置突出 + 锚点平滑滚动
    Exchange 2007 自定义传输规则
    基于jQuery打造TabPanel
  • 原文地址:https://www.cnblogs.com/LaoYuanPython/p/11087680.html
Copyright © 2020-2023  润新知