lunes, 12 de febrero de 2018

Programación Orientada a Objetos en Python, parte 2

Bueno, ya vimos clases y herencia en python. Esta segunda parte vamos a seguir hablando de la construcción de objetos.

La operación de instanciación crea un objeto vacío. En muchas ocasiones necesitamos crear objetos en un estado inicial particular. Por lo tanto se puede definir un método especial llamado __init__(), de esta forma:

def __init__(self):
    self.datos = []

Cuando definimos un método __init__(), la instanciación de la clase automáticamente invoca a __init__(). Entonces, en este ejemplo, una instancia nueva e inicializada se puede obtener haciendo:

x = MiClase()

Por supuesto, el método __init__() puede tener argumentos para mayor flexibilidad. En ese caso, los argumentos que se pasen al operador de instanciación de la clase van a parar al método __init__(). Por ejemplo,

>>> class Complejo:
...     def __init__(self, partereal, parteimaginaria):
...         self.r = partereal
...         self.i = parteimaginaria
...
>>> x = Complejo(3.0, -4.5)
>>> x.r, x.i
(3.0, -4.5)

Python permite las variables de instancia son para datos únicos de cada instancia y las variables de clase son para atributos y métodos compartidos por todas las instancias de la clase:

class Perro:

    tipo = 'canino'                 # variable de clase compartida por todas las instancias

    def __init__(self, nombre):
        self.nombre = nombre        # variable de instancia única para la instancia

  >>> d = Perro('Fido')
  >>> e = Perro('Buddy')
  >>> d.tipo                    # compartido por todos los perros
  'canino'
  >>> e.tipo                    # compartido por todos los perros
  'canino'
  >>> d.nombre                  # único para d
  'Fido'
  >>> e.nombre                  # único para e
  'Buddy'

Todo valor es un objeto, y por lo tanto un objeto conoce su clase (también llamado su tipo). Ésta se almacena como objeto.__class__ y es un objeto.