我理解__new__
的作用(以及它与__init__
的不同之处)所以我对定义不感兴趣,我对何时以及如何使用__new__
感兴趣。< / p>
文档说:
一般情况下,您不需要覆盖
__new__
,除非您正在为str
,int
,unicode
或tuple
等不可变类型创建子类
但我无法想到使用__new__
或如何正确使用它的其他情况(例如,当继承不可变类型或为什么在这种情况下需要它时)。
那么,何时,为何以及如何使用__new__
?
我对用例感兴趣,而不是它的用途(我知道它的作用)。
答案 0 :(得分:12)
回答我自己,我已经用它了
__new__
执行此操作)__call__
)datetime.datetime
类(不可变),如果没有参数实例化则返回当前时间,如果使用单个字符串参数调用则调用strptime
的结果如果你想改变用于构造不可变的参数,你需要__new__
,如我在datetime
示例中所希望的那样,或者如果你不想调用父__new__
根本不会返回以另一种方式创建的实例,甚至是完全不同的类型。当你在__init__
时,以任何方式改变对象为时已晚,所以你需要在__new__
中进行。
答案 1 :(得分:0)
潜在的用例可以是“工厂类”,它根据实现返回各种类的实例。