[pyar] Mi primer programa.
Emiliano Dalla Verde Marcozzi
edvm en fedoraproject.org
Vie Sep 12 14:29:58 ART 2014
El 11 de septiembre de 2014, 20:33, koxmoz koz Google <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'
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!
--
Broken code @ https://github.com/edvm
<edvm en python.org.ar>
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.python.org.ar/pipermail/pyar/attachments/20140912/1a108a63/attachment-0001.html>
More information about the pyar
mailing list