[pyar] Mi primer programa.

koxmoz koz Google koxmoz en gmail.com
Vie Sep 12 16:14:48 ART 2014


El 12/09/14 a las #4, Emiliano Dalla Verde Marcozzi escribió:
> El 11 de septiembre de 2014, 20:33, koxmoz koz Google 
> <koxmoz en gmail.com <mailto:koxmoz en gmail.com>> escribió:
>
>     Buenas gente!! como les va?
>
> Bien! Bienvenido!
>
>     Les repito, hice un pequeño curso y le puse muchas ganas (hasta
>     que pueda empezar la carrera). Desde ya les doy las gracias, Suerte.
>
> Más arriba mencionaron los 'getters' y 'setters'. En python, para 
> asignar un valor a un atributo de una instancia de clase no precisas
> tener obligatoriamente métodos que se llamen 
> 'get_attributo','set_attributo', ej:
>
> class Persona(object):
>     """Una persona."""
>     def __init__(self, dni):
>         self.dni = dni
>
>     def get_dni(self):
>         return self.dni
>
>     def set_dni(self, value):
>         self.dni = value
>
> Donde luego este código lo usarías como:
> >>> persona = Persona(dni='112233')
> >>> persona.get_dni()
> '112233'
> >>> persona.set_dni('221133')
> >>> persona.get_dni()
> '221133'
>
> Bien podes ahorrarte de escribir todas estas lineas y solo poner:
>
> class Persona(object):
>     """Una persona."""
>     def __init__(self, dni):
>         self.dni = dni
>
> Y luego utilizar esta nueva clase como:
> >>> persona = Persona(dni='112233')
> >>> persona.dni
> '112233'
> >>> persona.dni = '221133'
> >>> persona.dni
> '221133'
Hasta acá lo sabia. Yo lo hice porque me explicaron algo sobre 
encapsular, que creo que lo hice mal, como me decía uno de los chicos 
porque debí poner el "__" delante del atributo, y tampoco creo que se 
debiera aplicar, o no se cuando se debe encapsular (si no encuentro 
algún libro que lo explique bien, vuelvo para preguntar).
Lo que no sabia es lo siguiente:
>
> Ahora bien, esto de los getters y setters tienen una utilidad. 
> Imaginemos que cuando alguien crea instancias
> de tu clase Persona, y le asigna un valor al atributo 'dni', vos 
> queres asegurarte de que la longitud del dni sea
> mayor a 6 (por tirar un ejemplo). Esto bien lo podrías lograr creando 
> métodos tipo 'get_attributo', 'set_attributo',
> por ejemplo:
>
> class Persona(object):
>     """Una persona."""
>     def __init__(self, dni):
>         self.dni = dni
>
>     def get_dni(self):
>         return self.dni
>
>     def set_dni(self, value):
>         if len(value) < 6:
>             raise ValueError('Dni length must be >= 6.')
>         self.dni = value
>
> De esta forma, esta clase se podría usar como:
> >>> persona = Persona('112233')
> >>> persona.get_dni()
> '112233'
> >>> persona.set_dni('221133')
> >>> persona.get_dni()
> '221133'
> >>> persona.set_dni('2211')  # arroja error porque la longitud del dni 
> es menor a 6
> ...
> ValueError: Dni length must be >= 6.
>
> Pero esta clase tiene el inconveniente de que nos permite pasar un dni 
> con longitud menor a 6
> en el __init__, ej:
> >>> persona = Persona('1122')
> >>> persona.get_dni()
> '1122'
>
> Por lo que deberíamos refactorizar la clase para también asegurarnos 
> de que en el __init__, al
> pasar un dni como argumento, confirmar que el valor de su longitud es 
> >= a 6, por ejemplo:
> class Persona(object):
>     """Una persona."""
>     def __init__(self, dni):
>         self.set_dni(dni)
>
>     def get_dni(self):
>         return self.dni
>
>     def set_dni(self, value):
>         if len(value) < 6:
>             raise ValueError('Dni length must be >= 6.')
>         self.dni = value
>
> Y esta clase la usaríamos como:
> >>> persona = Persona('1122')
> ...
> ValueError: Dni length must be >= 6.
>
> Bueno, Python para no tener que andar escribiendo métodos 
> 'set_attributo', 'get_attributo', tiene
> algo que se llama 'property' 
> (https://docs.python.org/2/library/functions.html#property)
> Esto de los 'properties', te va a permitir escribir lo anterior como:
>
> class Persona(object):
>     """Una persona."""
>     def __init__(self, dni):
>         self.dni = dni
>
>     @property
>     def dni(self):
>         return self._dni
>
>     @dni.setter
>     def dni(self, value):
>         if len(value) < 6:
>             raise ValueError('Dni length must be >= 6.')
>         self._dni = value
>
> Que podes utilizar como:
> >>> persona = Persona('112233')
> >>> persona.dni
> '112233'
> >>> persona.dni = '333333'
> >>> persona.dni
> '333333'
> >>> persona.dni = '1'
> ...
> ValueError: Dni length must be >= 6.
>
> El '@dni.setter' (que sería maso menos el equivalente al método 
> 'set_dni') es el que se ejecuta siempre que
> en la instancia de Persona hagas algo como: persona.dni = 'valor acá'. 
> Y cuando queres obtener el valor del
> dni de la persona, por ejemplo:
> >>> enviar_por_email(persona.dni)
> Al querer acceder al atributo 'dni' de la instancia persona, se ejecuta:
> @property
> def dni(self):
>     ...
>
> Bueno, espero poder haber tirado un poco de luz al tema de los 
> 'getters' / 'setters' y properties en Python,
> Saludos!
>
Totalmente, voy a estar leyendo un poco mas sobre esto! muchas gracias!!
>
> -- 
> Broken code @ https://github.com/edvm
>
>
>
> _______________________________________________
> pyar mailing list pyar en python.org.ar
> http://listas.python.org.ar/listinfo/pyar
>
> PyAr - Python Argentina - Sitio web: http://www.python.org.ar/
>
> La lista de PyAr esta Hosteada en USLA - Usuarios de Software Libre de Argentina - http://www.usla.org.ar



More information about the pyar mailing list