Python中__new__和__init__的区别与联系

原创
ithorizon 7个月前 (10-03) 阅读数 125 #Python

Python中__new__和__init__的区别与联系

在Python类的定义中,时常可以看到两个特殊的方法:__new____init__。这两个方法在类的实例化过程中起着至关重要的作用,但它们之间有着本质的区别。

__new__方法

__new__是一个静态方法,它在创建类的新实例时被调用。在Python中,创建实例实际上是通过调用类的构造器实现的,而这个构造器就是__new__方法。它接收的第一个参数是类本身,其余参数是传递给类构造器的参数。

__new__的首要职责是创建并返回类的实例。如果在类继承体系中,子类没有重写__new__方法,它会默认调用其基类的__new__方法。此外,__new__方法必须返回一个实例,否则实例化过程会落败。

class MyClass:

def __new__(cls, *args, **kwargs):

print("In __new__")

return super().__new__(cls)

my_instance = MyClass()

__init__方法

__init__是一个实例方法,它在类的实例创建之后立即被调用。它的作用是初始化新创建的实例,设置其属性等。当你对一个实例进行初始化时,实际上是在调用这个方法。

__init__不接受类作为第一个参数,它接收的参数是在创建实例时传递的参数。通常,__init__不需要返回值,基于它是在已经创建好的实例上进行操作的。

class MyClass:

def __init__(self, value):

print("In __init__")

self.value = value

my_instance = MyClass(10)

区别与联系

  • 调用时机不同:__new__在实例创建时调用,__init__在实例创建后调用。
  • 参数不同:__new__的第一个参数是类本身,__init__没有类作为第一个参数。
  • 作用不同:__new__负责创建并返回实例,__init__负责初始化实例。
  • 返回值:__new__必须返回一个实例,否则实例化落败;__init__通常不需要返回值。
  • 联系:在实例化过程中,__new____init__都是自动调用的,且都是在类的构造器中。

应用场景

在实际编程中,通常不需要重写__new__方法,除非有以下几种情况:

  • 需要控制实例的创建过程,例如实现单例模式。
  • 继承不可变类型(如str、int等),并在其基础上添加新的功能。
  • 实现元类(metaclass)时,通常需要重写__new__方法。

__init__方法则时常用于初始化实例属性,使实例在创建后立即进入可用状态。


本文由IT视界版权所有,禁止未经同意的情况下转发

文章标签: Python


热门