He revisado la mayor parte de la documentación __getitem__
en los documentos de Python, pero aún no puedo comprender el significado.
Entonces, todo lo que puedo entender es que __getitem__
se usa para implementar llamadas como self[key]
. Pero ¿cuál es el uso de la misma?
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 escuché que Python llama __getitem__
internamente. Pero ¿por qué lo hace?
¿Puede alguien explicar esto con más detalle?
Solución del problema
Cong Ma hace un buen trabajo al explicar __getitem__
para qué se usa, pero quiero darte un ejemplo que podría ser útil. Imagina una clase que modela un edificio. Dentro de los datos del edificio incluye una serie de atributos, incluyendo descripciones de las empresas que ocupan cada piso:
Sin usar __getitem__
tendríamos una clase como esta:
class Building(object):
def __init__(self, floors):
self._floors = [None]*floors
def occupy(self, floor_number, data):
self._floors[floor_number] = data
def get_floor_data(self, floor_number):
return self._floors[floor_number]
building1 = Building(4) # Construct a building with 4 floors
building1.occupy(0, 'Reception')
building1.occupy(1, 'ABC Corp')
building1.occupy(2, 'DEF Inc')
print( building1.get_floor_data(2) )
Sin embargo, podríamos usar __getitem__
(y su contraparte __setitem__
) para hacer que el uso de la clase Building sea 'más agradable'.
class Building(object):
def __init__(self, floors):
self._floors = [None]*floors
def __setitem__(self, floor_number, data):
self._floors[floor_number] = data
def __getitem__(self, floor_number):
return self._floors[floor_number]
building1 = Building(4) # Construct a building with 4 floors
building1[0] = 'Reception'
building1[1] = 'ABC Corp'
building1[2] = 'DEF Inc'
print( building1[2] )
Si usa __setitem__
esto realmente depende de cómo planea 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 cortar - es decir, obtenga los datos de más de un piso a la vez - depende de lo que necesite.
No hay comentarios:
Publicar un comentario