J'ai parcouru la plupart de la documentation de __getitem__
la documentation Python, mais je suis toujours incapable d'en saisir la signification.
Donc, tout ce que je peux comprendre, c'est qu'il __getitem__
est utilisé pour implémenter des appels comme self[key]
. Mais à quoi cela sert-il?
Disons que j'ai une classe python définie de cette manière:
class Person:
def __init__(self,name,age):
self.name = name
self.age = age
def __getitem__(self,key):
print ("Inside `__getitem__` method!")
return getattr(self,key)
p = Person("Subhayan",32)
print (p["age"])
Cela renvoie les résultats comme prévu. Mais pourquoi l'utiliser __getitem__
en premier lieu? J'ai également entendu dire que Python appelle en __getitem__
interne. Mais pourquoi le fait-il?
Quelqu'un peut-il expliquer cela plus en détail?
__getitem__
utilisation dans votre exemple n'a pas beaucoup de sens, mais imaginez que vous devez écrire une classe personnalisée de type liste ou dictionnaire, qui doit fonctionner avec le code existant qui utilise[]
. C'est une situation où__getitem__
c'est utile.Réponses:
Cong Ma fait un bon travail pour expliquer à quoi
__getitem__
sert - mais je veux vous donner un exemple qui pourrait être utile. Imaginez une classe qui modélise un bâtiment. Dans les données du bâtiment, il comprend un certain nombre d'attributs, y compris des descriptions des entreprises qui occupent chaque étage:Sans utiliser,
__getitem__
nous aurions une classe comme celle-ci:Nous pourrions cependant utiliser
__getitem__
(et son équivalent__setitem__
) pour rendre l'utilisation de la classe Building «plus agréable».Que vous utilisiez
__setitem__
comme ça dépend vraiment de la façon dont vous envisagez d'abstraire vos données - dans ce cas, nous avons décidé de traiter un bâtiment comme un conteneur d'étages (et vous pouvez également implémenter un itérateur pour le bâtiment, et peut-être même la possibilité de découper - c'est-à-dire obtenir les données de plus d'un étage à la fois - cela dépend de ce dont vous avez besoin.la source
building1[2]
cet appel lui-même appelle le getitem. Donc, le point que @ tony-suffolk-66 fait est que toute propriété / variable de la classe peut être récupérée pendant l'exécution en appelant simplement objectname [variablename]. Simplement clarifier cela car ce n'était pas clair pour moi au départ et l'écrire ici en espérant que cela aide quelqu'un. Supprimer si redondant s'il vous plaîtlen()
, et vous obtiendrez unTypeError
:TypeError: object of type 'Building' has no len()
La
[]
syntaxe pour obtenir un élément par clé ou index n'est que du sucre de syntaxe.Lorsque vous évaluez les
a[i]
appels Pythona.__getitem__(i)
(outype(a).__getitem__(a, i)
, mais cette distinction concerne les modèles d'héritage et n'est pas importante ici). Même si la classe dea
ne définit pas explicitement cette méthode, elle est généralement héritée d'une classe ancêtre.Tous les noms de méthodes spéciales (Python 2.7) et leur sémantique sont répertoriés ici: https://docs.python.org/2.7/reference/datamodel.html#special-method-names
la source
La méthode magique
__getitem__
est essentiellement utilisée pour accéder aux éléments de liste, aux entrées de dictionnaire, aux éléments de tableau, etc. Elle est très utile pour une recherche rapide des attributs d'instance.Ici, je montre cela avec un exemple de classe Person qui peut être instancié par «nom», «âge» et «dob» (date de naissance). La
__getitem__
méthode est écrite de manière à pouvoir accéder aux attributs d'instance indexés, tels que le prénom ou le nom, le jour, le mois ou l'année du dob, etc.Supposons qu'une entrée utilisateur soit la suivante:
Avec l'aide de la
__getitem__
méthode, l'utilisateur peut accéder aux attributs indexés. par exemple,la source