Python 常用内建方法:__new__()与__init__()使用详解

Python 常用内建方法:__new__()与__init__()使用详解

构造方法包括创建、初始化对象,在Python当中,先执行__new__方法,然后执行__init__方法,从官方文档可以看到:

  • __new__是在实例对象创建之前被调用的,会返回当前对象的一个实例,因为它的任务就是创建实例然后返回该实例,是静态方法。
  • __init__是当实例对象创建完成后被调用的,然后设置对象属性的一些初始值,无返回值。
  • 也就是说,__new__在__init__之前被调用,__new__的返回值(实例)将传递给__init__方法的第一个参数self,然后__init__在__new__的基础上上完成一些初始化的操作,如给这个实例设置一些参数,__init__不需要返回值,如下实例代码:

    Python 常用内建方法:__new__()与__init__()使用详解

    通过如下执行结果可以看出,TestOps类中__new__在__init__之前被调用,__new__的返回值(实例对象)与__init__方法的第一个参数self为同一个对象,然后__init__在__new__的基础上上完成一些初始化的操作,如 self.time = time.time(),同时__init__不需要返回值。

    Python 常用内建方法:__new__()与__init__()使用详解

    如果__new__创建的是当前类的实例(__new__(cls),通过cls来保证是当前类实例),会自动调用__init__函数。如果__new__创建的不是当前类的实例,就不会调用当前类的__init__函数,也不会调用其他类的__init__函数,如下实例代码:

    Python 常用内建方法:__new__()与__init__()使用详解

    可以看到当TestOps中__new__创建的不是当前类的实例,而是Other的实例时,没有调用当前类TestOps的__init__函数,也没有调用Other类的__init__函数,同时执行的common实例方法来自Other类,并不是当前TestOps类。

    Python 常用内建方法:__new__()与__init__()使用详解

    总结

  • __new__方法是定义在元类type里面的,用于创建实例,并将实例传给__init__函数。因此__new__必须具有返回值,__init__函数依赖该返回,否则无法创建对象。
  • __new__的本质上是类方法,故以cls为第一个参数,但是因为系统知道它是类方法,因此不需要显式添加@classmethod
  • 自己在定义__new__的时候,__new__的参数要与__init__函数的参数对应匹配,或者可以使用*arg和**args的形式,代码示例如下:
  • Python 常用内建方法:__new__()与__init__()使用详解

    专栏每天八分钟Python基础编程作者:软件测试开发技术栈7.9币10人已购查看

    来源:软件测试开发技术栈

    声明:本站部分文章及图片转载于互联网,内容版权归原作者所有,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

    上一篇 2019年6月14日
    下一篇 2019年6月14日

    相关推荐