Utiliser len () et Def Len (self): pour construire une classe

Juste curieux,

Y a-t-il une différence (avantages et inconvénients) entre l'utilisation de len() ou def __len__() lorsque je construis une classe? Et quel est le meilleur style Python?

   class foo(object):
      def __init__(self,obs=[])
         self.data = obs
         self.max = max(obs)
         self.min = min(obs)
         self.len = len(obs)

Ou

   class foo(object):
      def __init__(self,obs=[])
         self.data = obs
         self.max = max(obs)
         self.min = min(obs)
      def __len__(self):
         return len(self.data)
22
demandé sur glglgl 2013-02-27 18:03:26

2 réponses

Il y a une différenceénorme .

La méthode __len__() est une méthode hook. Le len() la fonction utilisera la méthode __len__ si elle est présente pour interroger votre objet pour sa longueur.

L'APInormale que les gens s'attendent à utiliser est la méthode len(), l'utilisation d'un attribut .len à la place s'écarterait de cette norme.

Si la longueur de self.data ne devrait pas changer, vous pouvez toujours mettre en cache la longueur dans un attribut et avoir .__len__() retourner cela attribut.

class foo(object):
    def __init__(self, obs=None):
        if obs is None:  # provide a default if no list was passed in.
            obs = []
        self.data = obs
        self.max = max(obs)
        self.min = min(obs)
        self._data_len = len(obs)

    def __len__(self):
        return self._data_len
34
répondu Martijn Pieters 2013-02-27 14:20:39

Il y a plusieurs différences:

  1. seule la deuxième approche vous donnera la syntaxe len(obj) familière pour foo. Le premier nécessitera obj.len().
  2. Si la longueur de self.data peut changer après la construction, seule la deuxième version de refléter la nouvelle longueur.
6
répondu NPE 2013-02-27 14:05:32