Python的__new__有哪些用例?

Joh*_*oDo 7 python

我理解是什么__new__(以及它与之有什么不同__init__)所以我对定义不感兴趣,我对何时以及如何使用感兴趣__new__.

文件说:

在一般情况下,你不应该需要重写__new__,除非你继承一个不变型像str,int,unicode或tuple

但我无法想到使用其他情况__new__或如何正确使用它(例如,当子类化不可变类型或为什么在这种情况下需要它时).

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

我对用例很感兴趣,而不是它的用途(我知道它的作用).

Lau*_*low 12

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

  • 创建一个单例模式(虽然有方法可以不使用__new__)
  • 从外部模块动态扩展类而不实际编辑源
  • 自定义元类中的类(虽然__call__我认为也可以使用)
  • 扩展一个datetime.datetime类(它是不可变的),如果没有参数的instanciated,则返回当前时间,如果strptime使用单个字符串参数调用,则调用参数的结果

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