python - barplot - pandas plot
Python anulando getter sin setter (1)
Use solo el decorador .getter
de la propiedad original:
class superhuman(human):
@human.name.getter
def name(self):
return ''super '' + self._name
Tenga en cuenta que debe usar el nombre completo para llegar al descriptor de propiedad original en la clase principal.
Demostración:
>>> class superhuman(human):
... @human.name.getter
... def name(self):
... return ''super '' + self._name
...
>>> s = superhuman(''john'')
>>> print s.name
super john
>>> s.name = ''jack''
>>> print s.name
super jack
El objeto descriptor de property
es solo un objeto, aunque puede tener múltiples métodos asociados (getter, setter y deleter). Las .getter
.setter
.getter
, .setter
y .deleter
proporcionadas por un descriptor de property
existente devuelven una copia del descriptor, con ese único método específico reemplazado.
Entonces, en su clase de base human
, lo que sucede es que primero crea el descriptor con @property
decorator, luego reemplaza ese descriptor con uno que tenga tanto getter como setter con la sintaxis @name.setter
. Eso funciona porque los decoradores de pitón reemplazan la función decorada original con el mismo nombre, básicamente ejecuta name = name.setter(name)
. Ver ¿Cómo funciona el decorador @property? para los detalles sobre cómo funciona todo eso.
En su subclase, simplemente usa ese truco para crear una nueva copia del descriptor con solo el getter reemplazado.
class human(object):
def __init__(self, name=''''):
self.name = name
@property
def name(self):
return self._name
@name.setter
def name(self, value):
self._name = value
class superhuman(human):
@property
def name(self):
return ''super '' + name
s = superhuman(''john'')
print s.name
# Doesn''t work :( "AttributeError: can''t set attribute"
s.name = ''jack''
print s.name
Quiero poder anular la propiedad pero poder usar el setter del súper padre sin tener que anular el setter en la clase secundaria.
¿Es eso posible pythonicaly?