Open Franbelen opened 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ó!
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