__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__函数。