web-dev-qa-db-fra.com

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 crée 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)
27
Gianni Spear

Il y a une différence énorme.

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

L'API normale que les gens s'attendent à utiliser est la méthode len(), utiliser 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 demander à .__len__() de renvoyer cet 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
37
Martijn Pieters

Il existe plusieurs différences:

  1. Seule la deuxième approche vous donnera la syntaxe familière de len(obj) pour foo. Le premier nécessitera obj.len().
  2. Si la longueur de self.data peut changer la post-construction, seule la deuxième version reflétera la nouvelle longueur.
6
NPE