IIC2233 / Syllabus-2022-1

Repositorio oficial del curso IIC2233 Programación Avanzada 🚀✨
https://iic2233.ing.puc.cl/
45 stars 40 forks source link

Uso de propertyes para listas #208

Open Franbelen opened 2 years ago

Franbelen commented 2 years ago

Prerrequisitos

(Marcar colocando una X entre los corchetes los ítems que ya hiciste, así: "[X]")

Duda

Estoy intentado usar propertyes para una lista y el setter no se llama al cambiar valores dentro de esta, como se puede hacer para que el setter funcione?

por ejemplo si pongo self.lista[0] = 1 no se llama al setter de lista

JJJGGGG commented 2 years ago

Hola @Franbelen . No puedes usar properties de esa forma. La razón es simple.

def class A:
    def __init__(self):
        self._lista = []
    @property
    def lista(self):
        return self.lista
    @lista.setter
    def lista(self, val):
        self.lista = val

Ese código resume probablemente el código que estás usando. Luego mira esto

a = A()
a.lista # llama el getter y retorna self._lista

a.lista.append(2) # llama el getter, retorna self._lista y luego le agrega un 2 al final

En este ejemplo, nunca se llama el setter, ya que el setter sólo se llama cuando actualizas el valor completo de la variable, llamando al operador asignación (self.lista=algo). No vale si llamas métodos que lo actualizan, o bien actualizas variables internas, python no lo reconoce como una asignación.

Ahora bien, puedes bypassear esto forzando una asignación. Esto no es eficiente, pero llamaría el setter como tu quieres

a = A()
a.lista += [2] # llama al getter, retorna _lista y luego asigna pasando por el setter

La otra opción que tienes es cambiar tu clase a algo como esto


def class A:
    def __init__(self):
        self._lista = []
    @property
    def lista(self):
        return self.lista
    @lista.setter
    def lista(self, val):
        self.lista = val
    def append_to_list(self, val):
        self._lista.append(val)

Para tu caso, que asignar el valor de lista[0], tal vez tengas que hacer un poco más de trabajo para lograr el resultado deseado.

Dime si te sirvió!