Python 是否可以从“新”返回“无”?

Python 是否可以从“新”返回“无”?,python,new-operator,Python,New Operator,一般来说,如果类的用户知道有时构造函数的计算结果为“无”,那么从\uuuu new\uuuu方法返回“无”是否合理 文档并没有暗示它是非法的,我也没有看到任何直接的问题(因为\uuuuu init\uuuu不会被调用,没有一个不是所讨论的自定义类的实例!)。但我担心 是否有其他未预料到的问题 让构造函数不返回任何值是否是一种好的编程实践 具体示例: class MyNumber(int): def __new__(cls, value): # value is a string (usu

一般来说,如果类的用户知道有时构造函数的计算结果为“无”,那么从
\uuuu new\uuuu
方法返回“无”是否合理

文档并没有暗示它是非法的,我也没有看到任何直接的问题(因为
\uuuuu init\uuuu
不会被调用,没有一个不是所讨论的自定义类的实例!)。但我担心

  • 是否有其他未预料到的问题
  • 让构造函数不返回任何值是否是一种好的编程实践
  • 具体示例:

    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)
    

    这并不违法。如果没有对结果做任何奇怪的处理,它将起作用。

    您应该避免这种情况。文档并没有详尽地列出您不应该做的事情,但它说明了
    \uuuuu new\uuuu
    应该做的事情:返回类的实例


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

    或者更确切地说,它会起作用。尝试用结果做几乎任何有趣的事情都不会成功。但这可能是问题的一部分,但文档还指出,如果不返回该类的实例,则不会调用init。我认为它隐式地允许返回类的非实例。至于例外情况,这对用户来说需要做更多的工作;他们需要尝试捕获异常,而不仅仅是检查对象是否为无。或者,如果用户希望使用单个异常处理程序(这就是整个异常点)来处理代码块的错误,那么这对用户来说就少了一点工作。需要记住两件事:Python中的错误处理通常(不总是,但大多数情况下)是通过异常完成的;让构造函数不构造对象就是异常行为的定义。在这种情况下,这不是异常情况。该类的用户用MyNumber类的值填充自己的数据结构,在其中有一些None值是非常好的。如果他将此视为一个例外,那么每次发生时,他只需手动填充None。这会改变你的观点吗?这似乎是一个奇怪的设计,拥有一个不返回任何值的类对我来说是非常奇怪的。我可能更愿意使用工厂函数;有一个工厂的回报似乎没有一个比这样做更令人惊讶。也许这只是我的C++根——我个人倾向于避免它,但这取决于你。这是不寻常的,但是是的,这是合法的。我的观点是,类和工厂之间真的没有太大的区别(如果有的话)。一个类是可调用的,那么为什么一个类返回None会令人惊讶呢?