初始化器与构造器
Initializer vs Constructor
我听说 python 中的 __init__
函数不是构造函数,它是一个初始化器,实际上 __new__
函数是构造函数,不同之处在于 __init__
函数在创建对象之后调用,__new__
之前调用。我对吗?你能更好地解释一下区别吗?为什么我们需要 __new__
和 __init__
?
__init__
以已构建的对象实例作为第一个参数调用(通常称为 self
,但这只是一个参数名称)。
__new__
而是调用传递 class 作为第一个参数,并预期 return 一个实例(稍后将传递__init__
).
例如,这允许 __new__
到 return 基于值的对象的一个已经存在的实例,这些对象是不可变的,身份不应该对其起作用。
本质上,__new__
负责创建实例(因此,它是 构造函数可能是准确的,正如您所指出的)而 __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__
接收 class (cls
)。由于 self
是对实例的引用,这应该很明显地告诉您实例已经在 __init__
被调用时创建,因为它已通过实例。也可以精确地调用实例方法,因为实例已经创建。
关于你的第二个问题,根据我的经验,很少需要使用 __new__
。可以肯定的是,在某些情况下更高级的技术可能会使用 __new__
,但这种情况很少见。人们可能会想使用 __new__
的一个臭名昭著的例子是创建 Singleton class(然而,这是否是一项好技术不是重点)。
无论好坏,您基本上可以控制实例化过程,以及在您的具体情况 中可能意味着什么。
正在考虑 documentation on class customization 了解更多详情。
根据这些方法的使用方式:__new__()
创建对象,__init__()
自定义它。
正如 6502 所注意到的,__new__
是静态方法的特例,它获取 class 作为其参数,而 __init__
获取由 __new__
[= 生成的对象16=]
我听说 python 中的 __init__
函数不是构造函数,它是一个初始化器,实际上 __new__
函数是构造函数,不同之处在于 __init__
函数在创建对象之后调用,__new__
之前调用。我对吗?你能更好地解释一下区别吗?为什么我们需要 __new__
和 __init__
?
__init__
以已构建的对象实例作为第一个参数调用(通常称为 self
,但这只是一个参数名称)。
__new__
而是调用传递 class 作为第一个参数,并预期 return 一个实例(稍后将传递__init__
).
例如,这允许 __new__
到 return 基于值的对象的一个已经存在的实例,这些对象是不可变的,身份不应该对其起作用。
本质上,__new__
负责创建实例(因此,它是 构造函数可能是准确的,正如您所指出的)而 __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__
接收 class (cls
)。由于 self
是对实例的引用,这应该很明显地告诉您实例已经在 __init__
被调用时创建,因为它已通过实例。也可以精确地调用实例方法,因为实例已经创建。
关于你的第二个问题,根据我的经验,很少需要使用 __new__
。可以肯定的是,在某些情况下更高级的技术可能会使用 __new__
,但这种情况很少见。人们可能会想使用 __new__
的一个臭名昭著的例子是创建 Singleton class(然而,这是否是一项好技术不是重点)。
无论好坏,您基本上可以控制实例化过程,以及在您的具体情况 中可能意味着什么。
正在考虑 documentation on class customization 了解更多详情。
根据这些方法的使用方式:__new__()
创建对象,__init__()
自定义它。
正如 6502 所注意到的,__new__
是静态方法的特例,它获取 class 作为其参数,而 __init__
获取由 __new__
[= 生成的对象16=]