[pyar] Mi primer programa.

Mariano Aquino mariano.aquino en gmail.com
Lun Sep 15 13:01:43 ART 2014


wow, 3 años programando en python y recien me entero de que existen las
@properties...
que lindo es darse cuenta de que siempre hay tantas cosas nuevas por
aprender =)

Mariano

2014-09-14 10:33 GMT-03:00 diego <dieguicho en gmail.com>:

> si ese es tu primer programa. estas contratado!!
>
> 2014-09-12 16:14 GMT-03:00 koxmoz koz Google <koxmoz en gmail.com>:
>
>
>> 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
>>>
>>
>> _______________________________________________
>> 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
>>
>
>
> _______________________________________________
> 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
>
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.python.org.ar/pipermail/pyar/attachments/20140915/853c5ff9/attachment-0001.html>


More information about the pyar mailing list