__new__和__init__的主要区别在于:
__new__是用来创造一个类的实例的(constructor),而__init__是用来初始化一个实例的(initializer)
构造方法包括创建对象和初始化对象,在python当中,分为两步执行:先执行__new__方法,然后执行__init__方法;
也就是,__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__函数。
python学习笔记之--__new__方法和__init__方法
原文:https://www.cnblogs.com/wenm1128/p/12222287.html