He revisado la mayor parte de la documentación de los documentos de __getitem__
Python, pero aún no puedo entender el significado de la misma.
Entonces, todo lo que puedo entender es que __getitem__
se usa para implementar llamadas como self[key]
. ¿Pero de qué sirve?
Digamos que tengo una clase de python definida de esta manera:
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"])
Esto devuelve los resultados como se esperaba. Pero, ¿por qué usar __getitem__
en primer lugar? También he escuchado que Python llama __getitem__
internamente. ¿Pero por qué lo hace?
¿Alguien puede explicar esto con más detalle?
__getitem__
uso en su ejemplo no tiene mucho sentido, pero imagine que necesita escribir una clase personalizada de tipo lista o diccionario, que tiene que funcionar con el código existente que usa[]
. Esa es una situación donde__getitem__
es útil.Respuestas:
Cong Ma hace un buen trabajo al explicar para qué
__getitem__
se utiliza, pero quiero darle un ejemplo que podría ser útil. Imagine una clase que modela un edificio. Dentro de los datos del edificio, incluye una serie de atributos, incluidas las descripciones de las empresas que ocupan cada piso:Sin usar
__getitem__
tendríamos una clase como esta:Sin embargo, podríamos usar
__getitem__
(y su contraparte__setitem__
) para hacer que el uso de la clase Building sea 'más agradable'.El uso de
__setitem__
este tipo realmente depende de cómo planee abstraer sus datos; en este caso, hemos decidido tratar un edificio como un contenedor de pisos (y también podría implementar un iterador para el Edificio, y tal vez incluso la capacidad de cortarlo) - es decir, obtener más de un piso a la vez - depende de lo que necesite.fuente
building1[2]
esa llamada internamente, llama al getitem. Entonces, el punto que @ tony-suffolk-66 está haciendo es que, cualquier propiedad / variable de la clase se puede recuperar durante el tiempo de ejecución simplemente llamando a objectname [variablename]. Solo aclaro esto, ya que no estaba claro para mí inicialmente y lo escribí aquí esperando que ayude a alguien. Eliminar si es redundante por favorlen()
, y obtendrá unTypeError
:TypeError: object of type 'Building' has no len()
La
[]
sintaxis para obtener el elemento por clave o índice es solo el azúcar de sintaxis.Cuando evalúa las
a[i]
llamadas de Pythona.__getitem__(i)
(otype(a).__getitem__(a, i)
, pero esta distinción se trata de modelos de herencia y no es importante aquí). Incluso si la clase dea
no puede definir explícitamente este método, generalmente se hereda de una clase ancestral.Todos los nombres de métodos especiales (Python 2.7) y su semántica se enumeran aquí: https://docs.python.org/2.7/reference/datamodel.html#special-method-names
fuente
El método mágico
__getitem__
se usa básicamente para acceder a elementos de la lista, entradas de diccionario, elementos de matriz, etc. Es muy útil para una búsqueda rápida de atributos de instancia.Aquí estoy mostrando esto con una clase de ejemplo Persona que se puede instanciar por 'nombre', 'edad' y 'dob' (fecha de nacimiento). El
__getitem__
método está escrito de forma tal que se pueda acceder a los atributos de instancia indexados, como nombre o apellido, día, mes o año del dob, etc.Supongamos que una entrada del usuario es la siguiente:
Con la ayuda del
__getitem__
método, el usuario puede acceder a los atributos indexados. p.ej,fuente