En esté artículo se muestra el uso de __getattr__ (se ejecuta al acceder a un atributo que no existe), como obtener valores y modificar valores, y como se simplifica con el uso del decorador @property.
Se creará la clase Punto donde se mostrará el uso de __getattr__:
class Punto(object): def __init__(self,x=3,y=5): self._x = x self._y = y def __getattr__(self,attr): print "No se puede acceder a un atributo invalido" if __name__ == "__main__": punto = Punto(5,5) punto.var
Al ejecutar el programa se tiene:
$ python ej6.py
No se puede acceder a un atributo invalido
Al intentar acceder a un atributo no existente se ejecuta el método __getattr__ donde se muestra en pantalla el mensaje no se puede acceder a un atributo invalido.
El siguiente código se vuelve a mostrar la clase punto pero está vez se tiene dos métodos, uno que muestra el valor del punto y otro que modifica el valor del punto y se usará la función interna property.
La sintaxis de la función property es:
property(getter,setter,delete,doc).
El código a continuación:
class Punto(object): def __init__(self,x,y): self._x = x self._y = y def get_punto(self): return (self._x, self._y) def set_punto(self,punto): self._x, self._y = punto punto = property(get_punto,set_punto) if __name__ == "__main__": punto = Punto(4,6) print(punto.punto) punto.punto = (10,15) print(punto.punto)
Al ejecutar el programa se tiene:
$ python ej7.py
(4, 6)
(10, 15)
Como último ejemplo de uso de getter y setter se muestra el uso del decorador @property, y como simplifica el uso de property con respecto al código anterior:
#!/usr/bin/env python3# -*- coding: utf-8 -*-class Punto(object):def __init__(self,punto):self._x,self._y = punto@propertydef punto(self):return (self._x,self._y)@punto.setterdef punto(self,punto):self._x,self._y = puntoif __name__ == "__main__":cordenada = Punto((4,6))print(cordenada.punto)cordenada.punto = (10,15)print(cordenada.punto)
Al ejecutar el programa se tiene:
$ python ej8.py
(4, 6)
(10, 15)
Lo primero que se hace es definir un método punto donde se retorna una tupla con el valor de x y de y, a este método se le coloca el decorador property. Luego se crea otro método llamado punto donde se toma un punto y se le asigna a x y a y pero definiendo un decorador @punto.setter el primer método hace el trabajo del getter y el segundo del setter.
Referencia:
No hay comentarios:
Publicar un comentario