2017-04-18 50 views
2

MyClass下面定义的接受单个参数arg如何在声明类实例时返回None

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

如果传入的参数arg不是整数,我想返回,而不是MyClass实例无。

a = MyClass(arg='Text Argument') 

但即使MyClass构造时arg不是整数所产生的变量a__init__返回无尚的MyClass一个实例:

print a 
<__main__.MyClass object at 0x0000000001FDEFD0> 

如何确保变量a仍然None如果MyClass被赋予非整数参数?

回答

5

即使可能,您也不应从构造函数返回NoneMyClass()的结果应始终为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') 

     ... 
+0

显式返回'None'确定(或者仅仅是'return'),因为默认情况下会发生这种情况。我想尽早退出'__init __()'方法,但是这样做不会影响实例是否被创建 - 可能只是初始状态。 – martineau

+1

的确如此,这措辞有些含糊。我的意思是*如果返回值有任何区别,你仍然不应该这样做* – deceze

+0

无论你的意思是什么,我的观点是你所说的不准确:不仅是可能的,还有可能这是完全知道它不会阻止创建实例的原因。这似乎并不是OP希望完成的。 – martineau

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

__new__返回不是实例的对象(在本例中为None)的情况下,将不会调用__init__

一个为什么你不应该使用上述原因如下:

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

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