在Python中重写__new__和__init__方法

8

可能是重复问题:
Python中__new__和__init__的使用?

据我所知,__init__与Java中的构造函数不同,因为__init__仅初始化已经隐式构造的对象(因为__init____new__之后调用)。然而,我曾经需要定义过的所有内容都使用了Java中“构造函数”的后一种属性。那么,在哪种情况下,程序员想要覆盖__new__呢?

编辑:顺便说一句,我问这个问题部分是因为我想知道覆盖new与使用接受此问题答案中的单独classmethod相比的优缺点:

Python中超越工厂模式


在我看来,这并不完全是一个精确的副本。 - abyx
2个回答

13

__new__ 方法实际上是在对象存在之前发生的。它是类型的静态方法。使用 __new__ 的情况是当你想要控制新对象的创建,例如一个单例。如果你的 __new__ 总是返回同一个对象实例,那么它就是一个单例。你不能用 __init__ 实现这个。

一般来说,在 "Python 的创造者 Guido 所期望的" 程序中,你不应该超过一个月使用 __new__ 方法 :)


有道理。那么,这种情况(下面的被接受答案)是否也适合覆盖__new__? - chimeracoder

3

__new__ 用于创建新的对象实例,__init__ 用于初始化它。

如果您设计了一个不可变类型,您必须在 __new__ 中进行初始化,例如参考 namedtuple(也可以参考 Python's use of __new__ and __init__?)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接