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:
- seule la deuxième approche vous donnera la syntaxe
len(obj)
familière pourfoo
. Le premier nécessiteraobj.len()
. - 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