Propiedad de Python en una lista

Soy nuevo en Python y acabo de descubrir las propiedades. Funciona bien cuando lo bash con una variable simple pero no puedo hacer que funcione en una lista. Al ejecutar el código siguiente, llamará dos veces al captador y no al configurador. Sé que en mi ejemplo, la propiedad no tiene valor agregado, pero es para simplificar.

class C: def __init__(self): self._x = [1, 2, 3] @property def x(self): print("getter") return self._x @x.setter def x(self, value): print("setter") self._x = value c = C() cx[1] = 4 print(cx[1]) 

¿Alguien tiene una idea de lo que estoy haciendo mal?

El setter / getter solo se usa si usted obtiene o establece directamente la propiedad:

 cx # getter cx = [1,2,3] # setter 

Si modifica un elemento en la propiedad, obtiene la propiedad y luego establece el elemento correspondiente. Tu ejemplo es equivalente a

 d = cx # getter again d[1] = 4 

También puede usar __getitem__ y __setitem__ para permitir directamente configurar y obtener elementos específicos.

 class C: def __init__(self): self._x = [1, 2, 3] @property def x(self): print("getter") return self._x @x.setter def x(self, value): print("setter") self._x = value def __getitem__(self, idx): print("getitem") return self._x[idx] def __setitem__(self, idx, value): print("setitem") self._x[idx] = value >>> c = C() >>> c[1] = 3 setitem >>> cx getter [1, 3, 3] >>> c[2] getitem 3 

Su cx[1] = 4 de hecho se divide en dos operaciones:

  1. obtener la propiedad “x” de c (=> getter)
  2. Establecer elemento en el objeto resultante.

No hay una manera fácil de cómo salir de esto. Pero de todos modos, al final hace lo que querías, ¿no?

Se llamaría al setter, si escribieras algo como:

 cx = another_list