在 Python 中,__new__
和 __init__
都是用于创建对象的特殊方法。它们之间的区别和联系如下:
__new__
方法是在对象实例化之前调用的,用于创建对象并返回该对象的引用。该方法的第一个参数是类对象,后面的参数与 __init__
方法相同。__new__
方法返回的对象实例将作为第一个参数传递给 __init__
方法。
__init__
方法是在对象实例化之后调用的,用于初始化对象的状态。该方法的第一个参数是对象实例本身,后面的参数与 __new__
方法相同。在 __init__
方法中,可以访问和修改对象的属性,但不能返回任何值。
__new__
方法通常用于自定义不可变类型的实现,例如字符串和元组。因为这些类型的对象一旦创建,就不能再修改其状态,所以需要在 __new__
方法中创建一个新的对象实例,并将其状态初始化为指定的值。而 __init__
方法则用于自定义可变类型的实现,例如列表和字典。因为这些类型的对象可以修改其状态,所以需要在 __init__
方法中初始化对象的状态,并提供一些方法来修改其状态。
在使用自定义类时,通常只需要实现 __init__
方法即可,因为 __new__
方法已经有一个默认实现,可以创建一个新的对象实例并返回其引用。不过,如果需要自定义对象创建的过程,例如使用单例模式或者实现对象池,就可以重写 __new__
方法来实现。
__new__
方法和 __init__
方法之间的联系在于,它们都是用于创建对象的特殊方法。__new__
方法创建对象实例,而 __init__
方法初始化对象状态。它们之间的参数和返回值也有联系,__new__
方法的返回值将作为第一个参数传递给 __init__
方法,用于初始化对象状态。