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
?
答案 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!
很多事情会在你的代码中破裂,上面只是一个例子。