Actualmente estoy usando el decorador @property
para lograr ‘captadores y definidores’ en un par de mis clases. Deseo poder heredar estos métodos @property
en una clase secundaria.preponderantes con heredaron captadores y definidores propiedades en Python
que tienen algo de código Python (en concreto, estoy trabajando en py3k) que se parece vagamente a modo:
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 se devuelva el attr getter de la clase base. A.attr
devuelve un objeto de propiedad (¡que probablemente esté muy cerca de lo que necesito!).
Editar:
Después de recibir la respuesta por debajo de Ned me ocurrió lo que creo que es una solución más elegante a 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 .setter
decorador espera un objeto de propiedad que podemos conseguir utilizando @A.attr
. Esto significa que no tenemos que volver a declarar la propiedad en la clase secundaria.
(! Esta es la diferencia entre trabajar en un problema al final del día frente a trabajar en él al comienzo del día)
que tenían el mismo problema, y puede confirmar sus obras respuesta, pero ¡qué $ hitty "característica" - Añadir el nombre de vinculación superclase! !! Ese es un diseño pobre por parte de Python. O eso, o "reimplementar" la propiedad. O son malas "soluciones" a la herencia. – Marc