Crea propiedades usando lambda getter y setter

Tengo algo como esto:

class X(): def __init__(self): self.__name = None def _process_value(self, value): # do something pass def get_name(self): return self.__name def set_name(self, value): self.__name = self._process_value(value) name = property(get_name, set_name) 

¿Puedo reemplazar get_name y set_name usando las funciones lambda?

He intentado esto:

 name = property(lambda self: self.__name, lambda self, value: self.__name = self.process_value(value)) 

pero comstackdor no le gusta mi función de establecedor.

Su problema es que el cuerpo de la lambda debe ser una expresión y la asignación es una statement (una distinción fuerte y profunda en Python). Si insiste en perpetrar lambda s, se encontrará con muchos de estos casos y aprenderá las soluciones alternativas (por lo general, hay una, aunque no siempre), como en este caso:

 name = property(lambda self: self.__name, lambda self, value: setattr(self, '_X__name', self.process_value(value))) 

es decir, utilice el setattr (que es una función y, por lo tanto, aceptable en lambda cuerpo de un lambda ) en lugar de la asignación (que es una statement y, por lo tanto, inaceptable en lambda cuerpo de un lambda ).

Edición : También debe realizar la __name de _X__name para el atributo de subrayado doble manualmente (cambiando __name a _X__name como está en la clase X) donde el nombre del atributo se presenta como una cadena entre comillas, como debe estar en setattr, como El comstackdor de Pyhon solo hace el nombre de la cuestión en cuestión para los identificadores adecuados, no para los literales de cadena.

Si está extendiendo una list , también puede usar __setitem__ , así:

 class Position(list): def __init__(self,x=0, y=0, z=0): super(Position, self).__init__((x,y,z)) x = property(lambda self: self[0], lambda self,value: self.__setitem__(0, value)) y = property(lambda self: self[1], lambda self,value: self.__setitem__(1, value)) z = property(lambda self: self[2], lambda self,value: self.__setitem__(2, value))