[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