【发布时间】:2014-06-09 07:47:12
【问题描述】:
我熟悉 __new__ 与 __init__ 的理论。前者定义了如何创建类的实例(内存中的新对象),而后者则对其进行初始化(分配初始状态属性 - 字段)。网上有几篇关于这个的文章,比如this one:
当您需要控制新实例的创建时,请使用
__new__。 当你需要控制一个新的初始化时使用__init__实例。
正如我所说,我确实理解其中的区别,但是,当我需要使用 __new__ 而不是 __init__ 时,我无法想象现实世界的情况示例。如果我可以在对象创建期间自定义某些内容,我可以将其移至对象初始化——只要它是同一个对象。提到的链接说:
一般来说,您不需要覆盖
__new__,除非您是 继承不可变类型,如 str、int、unicode 或 tuple。
我的问题来了 - 有人可以举个例子,当覆盖 __new__ 实际上是使用 __init__ 无法完成的正确解决方案时,为什么会这样?
【问题讨论】:
-
@MartijnPieters 感谢您提供链接,但无论如何,我会很感激一个真实世界的例子。我想当你创建一个不可变的元组时,你不能在 init 中对它做任何事情,因为它在定义上是不可变的。
-
__new__在您必须进行 C 级分配时也很有用。例如,您可能有一个未使用的对象池,初始化成本很高,因此当您需要一个新对象时,您只需从那里获取它,而不是创建一个全新的对象。 -
@tkoomzaaskz: "Real-world": docs.python.org/2/library/… 是的,你需要
__new__,因为在创建实例时它无法再更改。