2016-10-12 9 views
2

引数が期待値と一致しない場合、インスタンスの作成を避けたいと思います。
I.要するに:インスタンスを作成しない方法*

#!/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

例外を発生させるか、 '__init__'の代わりに' __new__'を上書きしてください。 – kindall

+3

コンストラクタで例外をスローします。これは、不正なコンストラクタ引数を処理する標準的な方法です。 – Carcigenicate

答えて

7

__init__方法で例外だけraise

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

関連する問題