Python - Initializer vs Constructor
我听说python中的__init__函数不是一个构造函数,它是一个初始值设定项,实际上__new__函数是一个构造函数,不同的是,__init__函数是在对象创建之后调用的,__new__函数是在之前调用的。我说得对吗?你能更好地解释两者的区别吗?为什么我们需要__new__和__init__?
- 查看此链接:stackoverflow.com/questions/674304/pythons在‌&8203;IT中使用new和in
- EDCOX1(0)直接等同于其他OO语言(尤其是Java和C++)通常称为"构造函数"。阿法克,这些语言并没有直接等同于__new__的语言。但可能是因为"构造函数"等价物并不真正构造任何东西(而C++和Java的构造函数都不),所以Python倾向于把它们都称为实际的方法名称而不是调用"构造函数"。
本质上,__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__被称为将类作为第一个参数传递时,你指的是哪个类?
- @hellogoodbye:正在生成的对象的类。这可以是放置__new__的同一类,也可以是从该类派生的类(如果在该类定义__new__之前列出的派生基和其他基都不是)
更详细地考虑类定制的文档。
根据这些方法的使用方式:__new__()创建对象,__init__()自定义对象。
如6502所注意到的,__new__是静态方法的特例,以类作为参数,而__init__是__new__生成的对象。