2017-04-07 1 views
0

Quelle serait la meilleure façon d'initialiser les attributs et de vérifier les paramètres fournis lors de l'initialisation d'une classe python? Supposons qu'il existe plusieurs paramètres dans le __init__() et que certains d'entre eux doivent se conformer à certaines règles. Il y a aussi le besoin d'avoir des setters et getters pour certains d'entre eux. Je peux penser à l'option ci-dessous. Comment cela vous regarde-t-il? Y a-t-il de meilleures options?Méthode recommandée python init check

Option: Initialise les attributs None et appelle le setter, où la vérification est effectuée.

class A(object): 
    def __init__(self, p1=None, ..., pn=None): 
     self._p1 = None 
     ... 
     self._pn = None 

     if p1 is not None: 
      self.p1 = p1 
     ... 
     if pn is not None: 
      self.pn = pn 

    @p1.setter 
    def p1(self, p1): 
     # If p1 is int we can just take it 
     if isinstance(p1, int): 
      self._p1 = p1 
     # If p1 is str we have to obtain it differently 
     elif isinstance(p1, str): 
      self._p1 = self._gen_some_p_from_str(p1) 
     else: 
      raise Exception('Incorrect p1 type provided.') 
    ... 
    @pn.setter 
    def pn(self, pn): 
     # If pn instance of SomeOtherClass it should be also great 
     if isinstance(pn, SomeOtherClass): 
      if pn.great(): 
       self._pn = pn 
      else: 
       raise exception('pn not great') 
     # pn can be also str, and then we should get it 
     elif isinstance(pn, str): 
      self._pn = self._get_some_other_p_from_str(pn) 
     else: 
      raise Exception('Incorrect pn type provided.') 
+1

Débarrassez-vous des chèques. Ecrire la documentation/docstrings appropriée. D'ici c'est la poubelle dans -> garbage out. – timgeb

Répondre

-1

Si vous devez exécuter la validation sur chaque affectation, la propriété est à votre guise. Gardez à l'esprit que cela pourrait poser un problème de performance lorsque vous aurez plusieurs affectations (comme dans une boucle).

Votre problème peut être résolu par validate l'entrée uniquement sur le début de la classe, il vaut mieux avoir une méthode clean ou validate sur votre classe, puis appeler à la fin de la __init__ fonct. En utilisant cette méthode, vous pouvez appeler votre méthode clean quand vous en avez besoin, et omettre l'appel où les performances sont plus importantes que la validation (Voici comment fonctionne django forms).

Dans votre cas, votre essaient de faire une surcharge/dispatching, jetez un oeil à la docs

+0

Pourquoi downvoted? S'il vous plaît explaine –

+0

Je ne sais pas qui a fait la downvote. – Mihai

+0

Merci pour la réponse, mais pourriez-vous le détailler un peu? J'ai besoin de différentes fonctions de validation pour différents arguments et je pensais s'il était possible de supprimer le if dans le '__init __()' et de garder le '_ *' en même temps. – Mihai