【问题标题】:Real world example of overriding __new__ method in Python在 Python 中覆盖 __new__ 方法的真实示例
【发布时间】: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__,因为在创建实例时它无法再更改。

标签: python class


【解决方案1】:

单音模式 - 最明显的例子。 当您再创建一个对象时 - 它不是单音,对吗? 因此,您必须在创建对象时处理此问题。解决方案的一种变体 - 使用__new__() 方法。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2012-07-19
  • 2011-04-04
  • 2016-02-04
  • 1970-01-01
  • 2010-09-28
  • 2018-01-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多