[pyar] Mi primer programa.
diego
dieguicho en gmail.com
Dom Sep 14 10:33:55 ART 2014
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
>
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.python.org.ar/pipermail/pyar/attachments/20140914/55e8f748/attachment-0001.html>
More information about the pyar
mailing list