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)
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
Il existe plusieurs différences:
len(obj)
pour foo
. Le premier nécessitera obj.len()
.self.data
peut changer la post-construction, seule la deuxième version reflétera la nouvelle longueur.