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