What are the use cases for Python's __new__?
我了解__new__的作用(以及它与__init__的区别),所以我对定义不感兴趣,我对何时以及如何使用__new__感兴趣。
文件上说:
In general, you shouldn't need to override __new__ unless you're subclassing an immutable type like str, int, unicode or tuple
但我不能想到其他情况下使用__new__或如何正确地使用它(例如,在对不可变类型进行子类化时,或在这种情况下为什么需要它)。
那么,什么时候、为什么以及如何使用__new__?
我对用例感兴趣,而不是它做什么(我知道它做什么)。
- @麦克法兰:我知道,我对你需要使用新的情况很感兴趣(不仅仅是"对不可变类型进行子类化"这个短语)。这不是副本。
- @亲密选民这不是复制品。引用的问题问为什么总是在__new__之后调用__init__(不是)。这个问题要求为__new__提供实际的用例。这个问题的答案不是那个问题的答案。
- @拉齐尔:希望你不要介意,我把你的评论纳入了这个问题。谢谢!
- 什么,又一个亲密的选民?请阅读课文。它说:"这个问题涵盖的内容与之前关于这个主题的问题完全相同。它的答案可能与另一个相同的问题合并在一起(强调我的问题)。事实并非如此。组合问题中的答案看起来不合适!
- 在什么是Python中的元类中,您会发现非常好的用例?
- @你读过这个问题,所谓的复制品,评论和详细的原因描述吗?你愿意解释一下为什么你仍然认为结束这个问题是合适的吗?
- @据我所知,Lazyr是stackoverflow.com/questions/674304/pythons使用new和in‌&8203的复制品,其他四个用户也这么认为。如果这是错误的,请投票重新开始这个问题。
- @换句话说,你真的认为这个答案可以合并为这个问题的答案吗?
- @Lazyr我投票结束了这个问题,当时它被称为"python"——何时、为什么以及如何使用__new__。被引用问题的公认答案回答了这个原始标题。所以,是的,我想这是一个副本。
- @首先,阅读标题来判断它是否是复制品是不够的。标题后的第一句话是:"我理解__new__的作用(以及它与__init__的区别)"。其次,即使它是一个复制品(而不是),它现在不是,所以你应该投票重新打开。
- @拉兹尔,我投票决定重新讨论这个问题。我们现在能解决这个问题吗?
- @唐纳伙伴们,你也可以考虑撤销你的近距离投票吗?
- @我也希望你能阅读评论,看看你是否仍然相信这是一个副本。
我自己回答,我已经习惯了
- 创建一个单例模式(尽管有很多方法可以做到这一点,而不使用__new__)
- 从外部模块动态扩展类,而不实际编辑源代码
- 在元类中定制类(尽管我认为也可以使用__call__)
- 扩展一个datetime.datetime类(不可变),如果不带参数的声明,则返回当前时间;如果用单个字符串参数调用,则返回对参数调用strptime的结果。
如果您想更改用于构造不可变类型的参数(如我在datetime示例中所希望的那样),或者如果您根本不想调用父__new__,而是返回以另一种方式创建的实例,甚至是完全不同类型的实例,则在对不可变类型进行子类化时,需要__new__。到你在__init__的时候,以任何方式更改对象都为时已晚,所以你需要在__new__中进行更改。
- 你能分享一下你是怎么做到的吗?扩展datetime.datetime类…..
潜在的用例可以是"工厂类",它根据实现返回各种类的实例。