如何在声明类实例时返回None

2024-04-19 14:26:50 发布

您现在位置:Python中文网/ 问答频道 /正文

下面定义的MyClass接受单个参数arg。在

class MyClass(object):
    def __init__(self, arg):
        super(MyClass, self).__init__()
        if not isinstance(arg, int):
            return None
        else:
            self.arg = arg

如果传入参数arg不是整数,我希望返回None,而不是MyClass的实例。在

^{pr2}$

但是即使MyClass构造函数__init__arg不是整数时返回None,结果变量{}仍然是{}的实例:

print a
<__main__.MyClass object at 0x0000000001FDEFD0>

如果给MyClass一个非整数参数,如何确保变量a仍然是None?在


Tags: 实例selfnone参数if定义objectinit
2条回答

您通常不应该这样做,但是如果您愿意,可以通过重写您的__new__,在这里创建新实例:

class MyClass(object):
    def __new__(cls, **kwargs):
        if not isinstance(kwargs['arg'], int):
            return None
        return super(MyClass, cls).__new__(cls, **kwargs)

    def __init__(self, arg):
        super(MyClass, self).__init__()
        self.arg = arg

__init__方法不创建实例,它只初始化它,从中返回{}是预期的结果。在

__new__返回一个不是实例的对象(如本例中的None),则不会调用__init__。在

不应使用上述方法的原因之一是:

^{pr2}$

很多事情都会在你的代码中出现问题,以上只是一个例子。在

您不应该从构造函数返回None,即使这是可能的。MyClass()的结果应该始终是MyClass的一个实例或一个兼容的类;其他任何情况都将是非常令人惊讶和错误诱导行为™. 在

您可以使用一个自定义的__new__方法来实现这一点,该方法创建实际的实例。不过,我还是不推荐。在

如果无法使用给定数据构造对象,则应该引发异常:

class MyClass(object):
    def __init__(self, arg):
        super(MyClass, self).__init__()
        if not isinstance(arg, int):
            raise TypeError('arg must be an int')

        ...

相关问题 更多 >