2016-04-01 53 views
0

我想知道是否有方法來覆蓋python類中的__init__方法。我想出了這個,不完全是方法重寫,但它有相同的效果構造函數和方法在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的東西。這可能是strfloat