2017-07-12 17 views
2

たとえば、コンストラクタで、失敗する可能性のあるリソースを取得する必要があります。この場合、クラスをインスタンス化しないでください。Pythonでは、コンストラクタが失敗するクラスを実装する適切な方法は何ですか?

コンストラクタで例外をスローする必要がありますか?

class Foo(object): 
    def __init__(self): 
     self.rsc = get_resource(): 
     assert self.rsc 

インスタンス化コードで捕捉しようとしますか?

try: 
    a = Foo() 
except: 
    a = None 

その後、aがNoneであるかどうかをチェックします。本当に

+2

良いです。その結果、軽量のコンストラクタと、失敗しないコンストラクタの2つの利点が得られます。次に、必要に応じて、リソースを暗黙的に取得する関数を提供し、Noneを返すか、リソースでコンストラクタを呼び出します。 – amalloy

+0

あなたが提案したものはうまく聞こえます。問題は、その障害が発生した場合に起こりたいことです。それを処理する必要がある呼び出しコードの場合は、あなたが提案したように呼び出しコードで例外をキャッチする必要があります。 – BrenBarn

答えて

3

を追加します:

それはこのように、コンストラクタのパラメータとしてリソースを追加すると良いでしょう:

class Foo(object): 
    def __init__(self, rsc): 
     self.rsc = rsc 

このアプローチは多くの利点があります。

  • コンストラクタは、もはやあなたは、もはやあなたはfooとそのリソースタイプ間の疎結合を持っている高価なコンストラクタ
  • を持っていない
  • を失敗することはできませんが

また、暗黙的にリソースを取得するインタフェースが好きな場合は、これをラップするのは簡単です。自動的にリソースを取得するmake_fooの試みのような単純な機能、(あなたが好む場合、またはエラーを上げる)Noneを返さないとき、それはできません:だけに渡されるコンストラクタのパラメータとして `rsc`を追加する

def make_foo(): 
    rsc = get_resource() 
    if rsc: 
     return Foo(rsc) 
    else: 
     return None 
-3

問題ありません、ただinit機能でtry...exceptを追加し、それが失敗した場合のNoneのような特定の値を割り当てるか、その答えに私の以前のコメントを拡充、追加機能

class Foo(object): 
    def __init__(self): 
     try: 
      self.rsc = get_resource() 
      self.success = True 
     except: 
      self.rsc = None 
      self.success = False 

a = Foo() 
if a.success: 
    print(a.rsc) 
else: 
    do_something_else() 
+0

なぜdownvotesを説明する誰も気にすることができますか? –

+0

私は、このインターフェイスは、オブジェクトが正しく作成されたかどうかをチェックするのを忘れることによって、オブジェクトと間違って作業するのが非常に簡単になるため、downvotedしました。また、文法的に無効で、余分な ':'が付いています。 – amalloy

+0

は ':' so tnxを削除しましたが、チェックを忘れるというあなたの問題を回避する方法は見当たりません。クラスの外でも 'get_resource'自体が失敗したかどうかを忘れてしまいます。 –

関連する問題