初始化器与构造器

Initializer vs Constructor

我听说 python 中的 __init__ 函数不是构造函数,它是一个初始化器,实际上 __new__ 函数是构造函数,不同之处在于 __init__ 函数在创建对象之后调用,__new__ 之前调用。我对吗?你能更好地解释一下区别吗?为什么我们需要 __new____init__

__init__ 以已构建的对象实例作为第一个参数调用(通常称为 self,但这只是一个参数名称)。

__new__ 而是调用传递 class 作为第一个参数,并预期 return 一个实例(稍后将传递__init__).

例如,这允许 __new__ 到 return 基于值的对象的一个​​已经存在的实例,这些对象是不可变的,身份不应该对其起作用。

本质上,__new__ 负责创建实例(因此,它是 构造函数可能是准确的,正如您所指出的)而 __init__ 确实是一种在实例中初始化状态的方法。例如,考虑这个:

class A(object):

    def __new__(cls):
        return object.__new__(cls)

    def __init__(self):
        self.instance_method()

    def instance_method(self):
        print 'success!'

newA = A()

注意 __init__ 接收参数 self,而 __new__ 接收 class (cls)。由于 self 是对实例的引用,这应该很明显地告诉您实例已经在 __init__ 被调用时创建,因为它已通过实例。也可以精确地调用实例方法,因为实例已经创建。

关于你的第二个问题,根据我的经验,很少需要使用 __new__。可以肯定的是,在某些情况下更高级的技术可能会使用 __new__,但这种情况很少见。人们可能会想使用 __new__ 的一个臭名昭著的例子是创建 Singleton class(然而,这是否是一项好技术不是重点)。

无论好坏,您基本上可以控制实例化过程,以及在您的具体情况 中可能意味着什么。

正在考虑 documentation on class customization 了解更多详情。

根据这些方法的使用方式:__new__() 创建对象,__init__() 自定义它。

正如 6502 所注意到的,__new__ 是静态方法的特例,它获取 class 作为其参数,而 __init__ 获取由 __new__[= 生成的对象16=]