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?