Python的__new__有哪些用例?

时间:2012-10-11 08:20:45

标签: python

我理解__new__的作用(以及它与__init__的不同之处)所以我对定义不感兴趣,我对何时以及如何使用__new__感兴趣。< / p>

文档说:

  

一般情况下,您不需要覆盖__new__,除非您正在为strintunicodetuple等不可变类型创建子类

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

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

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

2 个答案:

答案 0 :(得分:12)

回答我自己,我已经用它了

  • 创建一个单例模式(尽管有ways可以不使用__new__执行此操作)
  • dynamically extend classes from external modules没有实际编辑源
  • 自定义元类中的类(虽然我认为也可以使用__call__
  • 扩展datetime.datetime类(不可变),如果没有参数实例化则返回当前时间,如果使用单个字符串参数调用则调用strptime的结果

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

答案 1 :(得分:0)

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