11

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

文档说:

通常,__new__除非您将不可变类型(如str,或intunicodetuple

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

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

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

4

2 回答 2

13

为自己回答,我用它来

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

如果您__new__想更改用于构造不可变类型的参数,就像我在datetime示例中想要的那样,或者如果您根本不想调用父__new__级但返回一个以另一种方式甚至是完全不同的类型。当您进入时,__init__以任何方式更改对象都为时已晚,因此您需要在__new__.

于 2012-10-11T08:47:02.247 回答
1

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

于 2012-10-11T08:46:25.587 回答