关于Python:Python – Initializer vs Constructor

Python - Initializer vs Constructor

本问题已经有最佳答案,请猛点这里访问。

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


本质上,__new__负责创建实例(因此,可以准确地说它是构造函数,正如您所指出的那样),而__init__确实是实例中初始化状态的一种方式。例如,考虑一下:

1
2
3
4
5
6
7
8
9
10
11
12
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__接收类(cls)。由于self是对实例的引用,这应该很明显地告诉您,该实例是在调用__init__时创建的,因为它通过了该实例。也可以调用实例方法,因为已经创建了实例。

关于你的第二个问题,我的经验很少需要使用__new__。可以肯定的是,在某些情况下,更先进的技术可能会使用__new__,但这些技术很少。有一个臭名昭著的例子,人们可能会倾向于使用__new__,那就是创建单例类(不管这是不是一个好的技术,不是重点)。

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


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

相反,调用__new__将类作为第一个参数传递,并期望返回一个实例(稍后将传递给__init__)。

例如,这允许__new__返回一个已经存在的基于值的对象实例,这些对象是不可变的,并且标识不应该对其起作用。


更详细地考虑类定制的文档。

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

如6502所注意到的,__new__是静态方法的特例,以类作为参数,而__init____new__生成的对象。