zoukankan      html  css  js  c++  java
  • 第8.4节 Python类中不是构造方法却胜似构造方法的__new方法__深入剖析:语法释义

    一、    引言
    在本博前面的内容都对构造方法__init__进行了介绍,也在前面章节引入了__new__方法,但老猿认为__new__方法比构造方法__init__更应该属于构造方法。这是因为在Python中,__new__方法是在实例对象创建时执行的,而构造方法__init__是实例创建后执行的。

    二、    __new__方法介绍
    __new__方法是Python新式类引入的,__new__通常用于控制生成一个新实例的过程。它是类级别的静态方法,是在创建实例对象前执行,如果自定义类中没有重写该方法,则Python自动调用父类的方法,当所有父类也没有重写定义该方法时,则直接调用object类的__new__方法。重写时,相关方法的语法如下:
    1.    语法:
    __new__(cls,*args,**kwargs)
    其中:
    4)    cls为创建实例对应类的类名,由Python自动传入;
    5)    args为实例创建时传入的非关键字参数,打包成元组tuple给函数体调用;
    6)    kwargs为实例创建时传入的关键字参数,形式为字典,键值为关键字参数的关键字,字典元素值为对应关键字参数的实参值。

    2.    语法释义:
    1)    __new__(cls,*args,**kwargs)的参数是与实例定义的参数相对应的,实例定义的语法如下:
    实例=类名(*args,**kwargs)
    则:
    d)    __new__的=方法中的cls一般为实例定义时的“类名”对应类,表示要创建一个该“类名”对应类型的实例,但在某些特殊情况下,可以改成其他类,如果类改成了其他类,则创建的实例就是什么类的类型。这种场景在某些时候特别有用,本节后面再介绍;
    e)    后面两个参数args、kwargs是完全复制实例定义中的两种参数,表示实例定义传入什么参数,则__new__方法是在实例定义参数的基础上增加一个“类cls”的参数,并将cls作为第一个参数。
    f)    args、kwargs不是两个参数,是两种参数,其中kwargs是关键字参数,args是非关键字参数,用args、kwargs分别传递创建实例时传递的所有常规实参和关键字参数实参,因此可能是0个或多个真正的参数。*args、**kwargs这种形式的参数传递模式称为“参数收集”,具体内容请参见本博客的《第5.2节 Python的函数参数收集》内容;
    2)    以上语法是自定义类重写__new__方法时必须遵守的语法,当Python准备创建实例时自动调用该方法,如果自定义类没有重写该方法,则Python默认调用该类的直接父类的__new__()方法来构造该类的实例。如果该类的父类也没有重写__new__(),那么将一直按此规矩追溯至object的__new__()方法。

    Python中的__new__方法非常神奇,是类实例化时的最关键方法,比构造方法__init__还重要,本节介绍了__new__的语法及各个参数的含义,实际上只介绍了基本的语法知识。请大家好好理解,鉴于该方法太重要,涉及内容比较多,后面几节将进一步深入剖析这个神奇的方法。
    老猿Python(https://blog.csdn.net/LaoYuanPython)系列文章用于逐步介绍老猿学习Python后总结的学习经验,这些经验有助于没有接触过Python的程序员可以很容易地进入Python的世界。
    欢迎大家批评指正,谢谢大家关注!
     

  • 相关阅读:
    对象池使用时要注意几点
    Flash3D学习计划(一)——3D渲染的一般管线流程
    714. Best Time to Buy and Sell Stock with Transaction Fee
    712. Minimum ASCII Delete Sum for Two Strings
    647. Palindromic Substrings(马拉车算法)
    413. Arithmetic Slices
    877. Stone Game
    338. Counting Bits
    303. Range Sum Query
    198. House Robber
  • 原文地址:https://www.cnblogs.com/LaoYuanPython/p/11087681.html
Copyright © 2011-2022 走看看