__new__和__init__的主要区别在于

__new__是用来创造一个类的实例的(constructor),而__init__是用来初始化一个实例的(initializer)

 

 构造方法包括创建对象和初始化对象,在python当中,分为两步执行:先执行__new__方法,然后执行__init__方法;

  • __init__是当实例对象创建完成后被调用的,然后设置对象属性的一些初始值。是一个实例方法
  • __new__是在实例创建之前被调用的,因为它的任务就是创建实例然后返回该实例,是个静态方法

也就是,__new__在__init__之前被调用,__new__的返回值(实例)将传递给__init__方法的第一个参数,然后__init__给这个实例设置一些参数。

在研究具体的实现之前,我们应该知道 __new__ 方法只接受 cls 作为它的第一个参数,而 __init__ 一个参数是 self (__new__ 是一个类方法,而__init__ 是一个对象方法)。

因为我们调用 __new__ 之前连实例都还没有,因此那时根本没有 self 的存在。__init__ 在 使用 __new__ 创建并返回一个实例之后调用,因此可将返回的实例通过self传递给它。

class newStyleClass(object):

    def __init__(self):
        print("__init__ is called")
        print("self is:",self)
    
    def __new__(cls):
        print("__new__ is called")
        return super(newStyleClass, cls).__new__(cls)



newStyleClass()

F:\PyCharm\pypoject\learn\venv\Scripts\python.exe E:/pytest/202001/a0121.py
__new__ is called
__init__ is called
self is: <__main__.newStyleClass object at 0x000002120D56FCC0>

 

创建类实例并初始化的过程中__new__和__init__被调用的顺序也能从上面代码的输出结果中看出:__new__函数首先被调用,构造了一个newStyleClass的实例,接着__init__函数在__new__函数返回一个实例的时候被调用,并且这个实例作为self参数被传入了__init__函数。

posted on 2020-02-18 13:59  腿短毛不多  阅读(169)  评论(0编辑  收藏  举报