2016-10-12 102 views
2

如果参数与期望值不匹配,我想避免创建实例。
I.e.总之:如何*不*创建实例

#!/usr/bin/env python3 

class Test(object): 
    def __init__(self, reallydoit = True): 
     if reallydoit: 
      self.done = True 
     else: 
      return None 

make_me = Test() 
make_me_not = Test(reallydoit=False) 

我想make_me_notNone,我认为return None能做到这一点,但这个变量是Test实例太:

>>> make_me 
<__main__.Test object at 0x7fd78c732390> 
>>> make_me_not 
<__main__.Test object at 0x7fd78c732470> 

我敢肯定有做到这一点的一种方式,但我的Google-fu到目前为止失败了。
谢谢你的帮助。

编辑:我宁愿这个被默默地处理;条件应该被解释为“最好不创建这个特定的实例”而不是“你正在使用这个类错误的方式”。所以是的,提出一个错误,然后处理它是一种可能性,但我宁愿减少噪音。

+1

You co uld尝试提出错误 – lordingtar

+1

引发异常,或者覆盖'__new__'而不是'__init__'。 – kindall

+3

在构造函数中抛出异常。这是处理错误构造函数参数的标准方法。 – Carcigenicate

回答

7

只是raise__init__方法异常:

class Test(object): 
    def __init__(self, reallydoit = True): 
     if reallydoit: 
      self.done = True 
     else: 
      raise ValueError('Not really doing it') 

另一种方法是在你的代码移到__new__方法:

class Test(object): 
    def __new__(cls, reallydoit = True): 
     if reallydoit: 
      return object.__new__(cls) 
     else: 
      return None 

最后,你可以移动创建判定成factory function

class Test(object): 
    pass 

def maybe_test(reallydoit=True): 
    if reallydoit: 
     return Test() 
    return None 
+1

我已经更新了这个问题来澄清它,'__new __()'似乎是最好的选择。谢谢! – Roberto