2012-10-11 45 views
5

我明白__new__是什么(以及它与__init__有什么不同),所以我对定义不感兴趣,我对什么时候以及如何使用__new__感兴趣。Python的__new__有什么用例?

文档说:

一般情况下,你不应该需要重写__new__除非你继承一个不变的类型像strintunicodetuple

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

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

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

+2

@MFFarlane:我知道,我对你需要使用__new__时的情况感兴趣(比“不可变类型的子类化”更多。**这不是重复。** – JohnDoDo

+1

@close选民这个问题不是重复的,所引用的问题是*为什么'__init__'总是在'__new__' *之后被调用(不是),这个问题要求'__new__'的实际用例。这个问题 –

+0

@lazyr:希望你不介意,我把你的意见纳入问题。谢谢! – JohnDoDo

回答

10

回答我自己,我已经将它用于

  • 创建一个单例模式(尽管有ways要做到这一点,而无需使用__new__
  • dynamically extend classes from external modules而不实际编辑源
  • 定制类在元类中(尽管__call__也可以用于我认为的)
  • 扩展datetime.datetime类(这是不可变的),以在没有争论的情况下返回当前时间发言:并呼吁说法strptime如果调用一个字符串参数继承一个不可变的类型时,如果你想改变用于构建不可变的参数

你需要__new__,我在datetime想要的结果例如,或者您根本不想调用父项__new__,而是返回创建另一种方式或甚至完全不同类型的实例。当你在__init__时,以任何方式改变对象为时已晚,所以你需要在__new__中完成。

+0

非常感谢! – JohnDoDo

0

潜在用例可能是一个“工厂类”,它根据实现返回不同类的实例。

相关问题