声明Class实例时如何返回None

时间:2017-04-18 15:25:08

标签: 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的实例。

a = MyClass(arg='Text Argument')

但即使MyClass构造函数__init__arg不是整数时返回None,结果变量a仍然是MyClass的实例:< / p>

print a
<__main__.MyClass object at 0x0000000001FDEFD0>

如果a被赋予非整数参数,如何确保变量None保持MyClass

2 个答案:

答案 0 :(得分:5)

您不应该从构造函数返回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')

        ...

答案 1 :(得分:2)

您通常不应该这样做,但如果您愿意,可以通过覆盖创建新实例__new__:< / p>

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__方法不创建该实例,它只对其进行初始化,从中返回None是预期的。

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

您不应使用上述内容的原因之一如下:

print isinstance(MyClass(arg='666'), MyClass) #-> False
# waaah!

很多事情会在你的代码中破裂,上面只是一个例子。