可能是重复问题:
Python中__new__和__init__的使用?
据我所知,__init__
与Java中的构造函数不同,因为__init__
仅初始化已经隐式构造的对象(因为__init__
在__new__
之后调用)。然而,我曾经需要定义过的所有内容都使用了Java中“构造函数”的后一种属性。那么,在哪种情况下,程序员想要覆盖__new__
呢?
编辑:顺便说一句,我问这个问题部分是因为我想知道覆盖new与使用接受此问题答案中的单独classmethod相比的优缺点:
可能是重复问题:
Python中__new__和__init__的使用?
据我所知,__init__
与Java中的构造函数不同,因为__init__
仅初始化已经隐式构造的对象(因为__init__
在__new__
之后调用)。然而,我曾经需要定义过的所有内容都使用了Java中“构造函数”的后一种属性。那么,在哪种情况下,程序员想要覆盖__new__
呢?
编辑:顺便说一句,我问这个问题部分是因为我想知道覆盖new与使用接受此问题答案中的单独classmethod相比的优缺点:
__new__
方法实际上是在对象存在之前发生的。它是类型的静态方法。使用 __new__
的情况是当你想要控制新对象的创建,例如一个单例。如果你的 __new__
总是返回同一个对象实例,那么它就是一个单例。你不能用 __init__
实现这个。
一般来说,在 "Python 的创造者 Guido 所期望的" 程序中,你不应该超过一个月使用 __new__
方法 :)
__new__
用于创建新的对象实例,__init__
用于初始化它。
如果您设计了一个不可变类型,您必须在 __new__
中进行初始化,例如参考 namedtuple
(也可以参考 Python's use of __new__ and __init__?)。