xticks barplot python oop properties setter getter

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?