Python 初始化器与构造函数

Python 初始化器与构造函数,python,constructor,initializer,Python,Constructor,Initializer,我听说python中的\uuuuu init\uuuuu函数不是构造函数,它是一个初始值设定项,实际上\uuuu new\uuuu函数就是构造函数,不同的是\uuuuu init\uuuu函数是在创建对象之后调用的,而\uuu new\uuuuu函数是在前面调用的。我说得对吗?你能更好地解释一下这两者的区别吗?为什么我们需要\uuuuu new\uuuuuu和\uuuuu init\uuuuu?\uuuuuuu init\uuuuuuu调用时,对象的一个已经构建的实例作为第一个参数(通常称为se

我听说python中的
\uuuuu init\uuuuu
函数不是构造函数,它是一个初始值设定项,实际上
\uuuu new\uuuu
函数就是构造函数,不同的是
\uuuuu init\uuuu
函数是在创建对象之后调用的,而
\uuu new\uuuuu
函数是在前面调用的。我说得对吗?你能更好地解释一下这两者的区别吗?为什么我们需要
\uuuuu new\uuuuuu
\uuuuu init\uuuuu

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

\uuuuu new\uuuuu
被称为将类作为第一个参数传递,并期望返回一个实例(该实例稍后将传递给
\uuuuuu init\uuuu


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

本质上,
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu>负责创建实例(因此,正如您所指出的,准确地说它是构造函数)而
\uuuu init\uuuu
实际上是一种在实例中初始化状态的方法。例如,考虑这一点:

class A(object):

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

    def __init__(self):
        self.instance_method()

    def instance_method(self):
        print 'success!'

newA = A()
请注意,
\uuuuuu init\uuuuu
接收参数
self
,而
\uuuuuuu new\uuuu
接收类(
cls
)。由于
self
是对实例的引用,这应该很明显地告诉您,在调用
\uuuu init\uuuu
时,该实例已经被创建,因为它已传递给实例。也可以精确地调用实例方法,因为已经创建了实例

至于你的第二个问题,根据我的经验,很少需要使用
\uuuu new\uuuu
。可以肯定的是,在某些情况下,更高级的技术可能会使用
\uuuuuu new\uuuuuu
,但这种情况很少。有一个臭名昭著的例子,人们可能会尝试使用
\uuuuu new\uuuuuu
,那就是创建Singleton类(不管这是不是一种好技术,这不是重点)

不管是好是坏,您基本上可以控制实例化过程,以及在特定情况下可能意味着什么

考虑更多细节

据了解,这些方法的使用方式如下:
\uuuuu new\uuuuu()
用于创建对象,而
\uuuu init\uuuuu()
用于自定义对象


正如6502所注意到的,
\uuuuu new\uuuu
是静态方法的特例,并获取类作为其参数,而
\uuuu init\uuuuu
获取由
\uu new\uuuuu

生成的对象。请检查此链接:
\uuu init\uuu
与其他OO语言(特别是Java和C++)倾向于调用的“构造函数”直接等价。恐怕这些语言实际上没有任何与
\uuuuu new\uuuuu
直接等价的东西。但是,可能是因为“构造函数”等价物并不真正构造任何东西(而C++和java构造函数都不),所以Python倾向于将它们都称为实际方法名称而不是调用“构造函数”。.当您说调用
\uuuu new\uuuu
将类作为第一个参数传递时,您指的是哪个类?@hellogoodbay:正在生成的对象的类。这可以是放置
\uuuuuu new\uuuuuu
的同一类,也可以是从该类派生的类(如果该类之前列出的派生基或其他基都未定义
\uuuuu new\uuuuu