2016-10-12 142 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