Python - 初始化程序与构造函数

时间:2015-03-01 08:43:00

标签: python constructor initializer

我听说python中的__init__函数不是构造函数,它是一个初始化函数,实际上__new__函数是构造函数,区别在于{{1}在创建对象和之前调用的__init__之后调用函数。我对吗?您能否更好地解释这些差异?为什么我们需要__new____new__

3 个答案:

答案 0 :(得分:7)

本质上,__new__负责创建实例(因此,正如你所注意到的那样,它是构造函数可能是准确的){{1}确实是一种在实例中初始化状态的方法。例如,考虑一下:

__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__)。由于cls是对实例的引用,因此它应该非常明显地告诉您实例已经被self调用的时间创建,因为它传递了实例。也可以精确调用实例方法,因为实例已经创建。

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

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

答案 1 :(得分:2)

使用已构建的对象实例作为第一个参数调用

__init__(通常称为self,但这只是一个参数名称。)

__new__被称为传递作为第一个参数,并且应该返回一个实例(稍后将传递给__init__)。

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

答案 2 :(得分:1)

考虑更多详情documentation on class customization

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

正如6502注意到的那样,__new__是静态方法的特例,并以类为参数,而__init__获取__new__生成的对象