2016-04-01 10 views
0

私は、__init__メソッドをPythonクラスでオーバーライドする方法があるかどうかを判断しようとしています。私は正確にメソッドがオーバーライドしていない、この出ているが、それは同じ効果Pythonでオーバーライドするコンストラクタとメソッド

class A(): 
    def __init__(self, x): 
     if isinstance(x, str): 
      print "calling some text parsing method" 
     elif isinstance(x, int): 
      print "calling some number crunching method" 
     else: 
      print "Oops" 

これは良い練習が願いを持っていますか?だけでなく、この特定の問題のようにも他の方法のためのコンストラクタのためにあまりにも

文字列引数のためのアクションが整数の引数のためのアクションとは非常に異なっている場合は、何をする必要があるか、本質的だ

答えて

1

。ただし、一方のケースが他方のケースに縮小する場合は、クラス・メソッドを代替のコンストラクタとして定義できます。簡単な例として、ここで

class A(): 
    def __init__(self, x): 
     if isinstance(x, str): 
      self.x = int(x) 
     elif isinstance(x, int): 
      self.x = x 
     else: 
      raise ValueError("Cannot turn %s into an int" % (x,)) 

を検討し、整数の場合は、Aのインスタンスを作成するには、「基本的な」方法です。文字列の大文字小文字は、文字列を整数に変換し、整数の場合と同じように処理します。

class A(): 
    # x is expected to be an integer 
    def __init__(self, x): 
     self.x = x 

    # x is expected to be a string 
    @classmethod 
    def from_string(cls, x): 
     try: 
      return cls(int(x)) 
     except ValueError: 
      # This doesn't really do anything except reword the exception; just an example 
      raise ValueError("Cannot turn %s into an int" % (x,)) 

一般的に、タイプは動作よりも重要ではないため、値のタイプを確認する必要はありません。たとえば、上記のfrom_stringは実際には文字列を期待しません。それはちょうどintになることができる何かを期待しています。それはstrまたはfloatです。

関連する問題