35. “__init__”和”__new__”有何区别

__init__方法的用途是什么

__init__初始化类对象时使用,它至少需要一个self参数。它在生成对象之后, 对对象的成员变量进行赋值。__init__函数不应当返回任何值,即返回为None

__init__函数不需要显式调用,他是在调用类名()时被自动调用。 实例方法的第一个参数为self, 这个self相当于c++语言中的this指针。self 变量用于在类实例方法 中引用方法所绑定的实例

__new__方法的用途是什么

调用它来创建类的新实例,__new__方法是一个静态方法,它返回对象的实例。 如果不返回对象的实例, __init__方法将不会调用到。它用于子类来修改类实例的创建。

  • 1,__new__ 在 __init__之前调用
  • 2,__new__调用时对象还未创建,调用完成后,返回对象。因此传递的参数是类对象。返回类的实例。
  • 3,__init__ 在类的实例创建之后自动调用,对类的实例内部进行初始化的过程。它不返回值。
  • 4,__new__通常用于扩展内部类型时使用
::
class Book:
def __new__(cls):
print(“__new__ is call”); return super().__new__(cls)
def __init__(self):
print(“__init__ is call”);

b = Book()

输出为:

__new__ is call
__init__ is call

我们可以看到__new__函数先调用, __init__函数后调用。