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