GOOGLE ADS

domingo, 24 de abril de 2022

Entendiendo el método __getitem__

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

Regla de Firestore para acceder a la generación de subcolección Permisos faltantes o insuficientes

Tengo problemas con las reglas de Firestore para permitir el acceso a algunos recursos en una subcolección. Tengo algunos requests document...