2016-02-20 1 views
3

J'ai créé une classe et j'aimerais donner à l'utilisateur (probablement moi) deux façons différentes de l'initialiser. Pour cet exemple, la classe est appelée Box et je souhaite initialiser avec soit:nécessite des paramètres nommés dans la fonction python

  1. deux ensembles de coordonnées cartésiennes, représentant le min et max (x, y).

  2. un ensemble de coordonnées cartésiennes représentant les minutes et les dimensions de la boîte

Je peux le faire en utilisant les paramètres nommés, mais je voudrais soulever une erreur si aucun paramètre nommé est appelé. Mon code actuel met un paramètre fictif appelé pass_var dans le cas où aucun paramètre nommé n'est appelé. Cela fonctionne, mais je pense qu'il doit y avoir une solution plus élégante ou 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='" 

Répondre

5

Si vous utilisez Python 3.x, vous pouvez utiliser * pour éviter que les paramètres de position indésirables:

class Box(object): 

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

2.x, vous ne recevrez pas automatiquement une erreur mais je ne pouvais faire par exemple:

class Box(object): 

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

Cependant, la manière conventionnelle de fournir différentes méthodes de création d'une classe est avec des méthodes de classe, par exemple:

class Box(object): 

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

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

Merci beaucoup! J'utiliserai les méthodes de classe comme vous le suggérez, cela rendra le code plus simple. – VectorVictor

+0

Aussi, si quelqu'un d'autre le trouve utile, voici plus sur classmethod - http://stackoverflow.com/questions/1950414/what-does-classmethod-do-in-this-code/1950927#1950927 – VectorVictor