Python 初始化器与构造函数
我听说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
\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
)