property objects define decorators and python properties

objects - Anulación de los generadores y establecedores de propiedades heredadas en Python



python get and set attributes (2)

Actualmente estoy usando el decorador @property para lograr "getters and setters" en un par de mis clases. Deseo poder heredar estos métodos @property en una clase secundaria.

Tengo un código Python (específicamente, estoy trabajando en py3k) que se parece vagamente a esto:

class A: @property def attr(self): try: return self._attr except AttributeError: return '''' class B(A): @property def attr(self): return A.attr # The bit that doesn''t work. @attr.setter def attr(self, value): self._attr = value if __name__ == ''__main__'': b = B() print(''Before set:'', repr(b.attr)) b.attr = ''abc'' print('' After set:'', repr(b.attr))

He marcado la parte que no funciona con un comentario. Quiero que la clase base ''attr getter sea devuelta. A.attr devuelve un objeto de propiedad (que probablemente esté muy cerca de lo que necesito).

Editar :
Después de recibir la respuesta de Ned a continuación, pensé en lo que creo que es una solución más elegante para este problema.

class A: @property def attr(self): try: return self._attr except AttributeError: return '''' class B(A): @A.attr.setter def attr(self, value): self._attr = value if __name__ == ''__main__'': b = B() print(''Before set:'', repr(b.attr)) b.attr = ''abc'' print('' After set:'', repr(b.attr))

El decorador .setter espera un objeto de propiedad que podamos obtener usando @A.attr . Esto significa que no tenemos que declarar la propiedad nuevamente en la clase secundaria.

(¡Esta es la diferencia entre trabajar en un problema al final del día o trabajar en él al comienzo del día!)


Creo que quieres:

class B(A): @property def attr(self): return super(B, self).attr

Menciona querer devolver al getter de la clase padre, pero necesita invocar al getter, no devolverlo.


Para anular un setter en python 2 hice esto:

class A(object): def __init__(self): self._attr = None @property def attr(self): return self._attr @attr.setter def attr(self, value): self._attr = value class B(A): @A.attr.setter def attr(self, value): # Do some crazy stuff with `value` value = value[0:3] A.attr.fset(self, value)

Para entender de dónde vino A.attr.fset , consulte la documentación en la clase de property : https://docs.python.org/2/library/functions.html#property