2016-02-20 22 views
3

我已經創建了一個類,我想給用戶(可能是我)兩種不同的方式來初始化它。對於此示例的類被稱爲Box和我想與要麼初始化:需要python函數中的命名參數

  1. 兩套笛卡爾座標,代表最小和最大(X,Y)。

  2. 一組表示分鐘笛卡爾座標以及箱尺寸

我可以通過使用命名參數做到這一點,但是我想,如果沒有名爲參數稱爲引發錯誤。在我沒有命名參數被調用的情況下,我當前的代碼在所謂的pass_var中放置了一個虛擬參數。它的工作原理,但我認爲必須有一個更優雅或Pythonic解決方案。

class Box(object): 

    def __init__(self, pass_var=None, coordinates=None, min_points=None, dimensions=None): 
     if coordinates: 
      setup_box_from_coordinates() 
      return 
     elif min_points and dimensions: 
      setup_box_from_dimensions() 
      return 
     raise NameError("Box Class needs to be initiated with 'coordinates='' or 'min_pts= & dimensions='" 

回答

5

如果你使用的是Python 3.x中,你可以使用*以防止不必要的位置 參數:

class Box(object): 

    def __init__(self, *, coordinates=None, min_points=None, dimensions=None): 
     ... 

在2.x中,你不會自動獲得一個錯誤,但能做例如:

class Box(object): 

    def __init__(self, *args, coordinates=None, min_points=None, dimensions=None): 
     if args: 
      raise TypeError('positional arguments not supported') 
     ... 

然而,傳統的方式是提供創建類不同的方法是用類方法,例如:

class Box(object): 

    @classmethod 
    def from_coordinates(cls, coordinates): 
     ... 

    @classmethod 
    def from_min_dimensions(cls, min_, dimensions): 
     ... 
+0

非常感謝!我將按照您的建議使用類方法,它將使代碼更直接。 – VectorVictor

+0

此外,如果其他人發現它有用,這裏是更多關於classmethod - http://stackoverflow.com/questions/1950414/what-does-classmethod-do-in-this-code/1950927#1950927 – VectorVictor

相關問題