【问题标题】:Is it ok to return None from __new__?可以从 __new__ 返回 None 吗?
【发布时间】:2010-10-05 02:28:17
【问题描述】:

一般来说,如果类的用户知道有时构造函数的计算结果为 None,那么从 __new__ 方法返回 None 是否合理?

文档并不暗示它是非法的,而且我没有看到任何直接的问题(因为不会调用 __init__,None 不是相关自定义类的实例!)。但我很担心

  1. 是否可能有其他不可预见的问题
  2. 让构造函数返回 None 是否是一种好的编程习惯

具体例子:

class MyNumber(int):
    def __new__(cls, value): # value is a string (usually) parsed from a file
        if value == 'N.A.':
            return None
        return int.__new__(cls, value)

【问题讨论】:

    标签: python new-operator


    【解决方案1】:

    这并不违法。如果结果没有做任何奇怪的事情,它就会起作用。

    【讨论】:

    • 或者更确切地说,它工作。试图用结果做几乎任何有趣的事情不会。但这可能是重点的一部分。
    【解决方案2】:

    你应该避免这种情况。该文档并未详尽列出您不应该做的事情,但它说明了__new__ 应该 做的事情:返回该类的实例。

    如果您不想在某些情况下返回新对象,请引发异常。

    【讨论】:

    • 但文档还说,如果没有返回类的实例,则不会调用 init。我将其理解为隐式允许返回类的非实例。至于异常,对用户来说工作量更大;他们需要尝试捕获异常,而不是仅仅检查对象不是 None。
    • 或者,如果用户希望使用单个异常处理程序(这是异常的全部点)来处理代码块的错误,那么对用户来说工作量会少一些。要记住两件事:Python 中的错误处理通常(不是总是,而是大多数时候)通过异常来完成;而让构造函数构造一个对象正是异常行为的定义。
    • 在这种情况下,这不是特殊情况。该类的用户使用 MyNumber 类的值填充他自己的数据结构,并且在那里有一些 None 值非常好。如果他将此视为异常,则每次发生时他都必须手动填充 None 。这会改变你的看法吗?
    • 这似乎是一个奇怪的设计,让一个类 ctor 返回 None 对我来说是非常令人惊讶的。我可能会更早使用工厂功能;让工厂返回 None 似乎比 ctor 这样做更令人惊讶。也许这只是我的 C++ 根源——我个人倾向于避免它,但这取决于你。这是不寻常的,但是是的,这是合法的。
    • 我的看法是,类和工厂之间真的没有太多(如果有的话)区别。一个类是可调用的,那么为什么让一个类返回 None 会令人惊讶呢?
    猜你喜欢
    • 1970-01-01
    • 2021-11-16
    • 1970-01-01
    • 2018-09-25
    • 2015-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多