[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