Python的 __new__是什么?

What are the use cases for Python's __new__?

我了解__new__的作用(以及它与__init__的区别),所以我对定义不感兴趣,我对何时以及如何使用__new__感兴趣。

文件上说:

In general, you shouldn't need to override __new__ unless you're subclassing an immutable type like str, int, unicode or tuple

但我不能想到其他情况下使用__new__或如何正确地使用它(例如,在对不可变类型进行子类化时,或在这种情况下为什么需要它)。

那么,什么时候、为什么以及如何使用__new__

我对用例感兴趣,而不是它做什么(我知道它做什么)。


我自己回答,我已经习惯了

  • 创建一个单例模式(尽管有很多方法可以做到这一点,而不使用__new__)
  • 从外部模块动态扩展类,而不实际编辑源代码
  • 在元类中定制类(尽管我认为也可以使用__call__)
  • 扩展一个datetime.datetime类(不可变),如果不带参数的声明,则返回当前时间;如果用单个字符串参数调用,则返回对参数调用strptime的结果。

如果您想更改用于构造不可变类型的参数(如我在datetime示例中所希望的那样),或者如果您根本不想调用父__new__,而是返回以另一种方式创建的实例,甚至是完全不同类型的实例,则在对不可变类型进行子类化时,需要__new__。到你在__init__的时候,以任何方式更改对象都为时已晚,所以你需要在__new__中进行更改。


潜在的用例可以是"工厂类",它根据实现返回各种类的实例。