Python se va OOP!

TL;DR Vamos a aprender un poco sobre la programación orientada a objetos y como sacar el potencial de Python utilizando POO dentro de cada uno de nuestros programas.

Hola! bienvenidos, hoy vamos a hablar un poco de que es la Programación orientada a objetos (POO o OOP en inglés) y como a través de ella vamos a mejorar muchísimo la limpieza de nuestro código.

La POO es un “paradigma” de programación que intenta imitar la realidad a través de “abstraer” o “describir” todos los objetos del “mundo real” a través de clases que son descriptores que tienen atributos y acciones que describen lo que tiene dicho objeto.

¿Alguna vez has intentado describir un edificio?, ¡intentemoslo!

Un edificio tiene (atributos) ¿pisos?, ¿oficinas?, ¿ventanas?, ¿puertas?, ¿ascensor?, ¿color del edificio?, ¿Porteria?… tal vez encuentres mas, pero con esto podemos trabajar….

Otra cosa, que puedo hacer en un edificio (metodos), ¿subir pisos?, ¿bajar pisos?, ¿gritar por las ventanas?, jeje, cada una de las cosas que podemos hacer con el edificio son metodos de clase.

Si decimos un edificio de 5 pisos, con 10 oficinas, 1 ascensor y de color rojo (objeto) estamos describiendo a partir de nuestros atributos un nuevo edificio, en la programación orientada a objetos cuando ya describimos los valores de cada atributo se dice que estamos “instanciando” un objeto del tipo Edificio.

Ahora, ya entendimos los 4 conceptos básicos de la POO, Clase, Objetos, Atributos y metodos, veamos ahora como python se va OOP!

Creando clases con Python

En python hay un concepto muy importante, y no debemos olvidar. ¡*Todo* en python son objetos!, no olvides ese concepto nunca y así podrás comenzar a desentrañar todo el poder de python.

class Building:
    pass

¡Facil!, utilizamos la palabra reservada “class” y el nombre de la clase y separamos con nuestros amigos los dos puntos (:) para separar la firma de la clase del cuerpo.

Nota: Importante, debemos tener en cuenta que la notación de arriba es usada para python3, si queremos definir un objeto en python2, debemos hacer una pequeña añadidura a nuestro codigo quedando asi :

class Building(object):
    pass

Esto por un concepto que veremos luego llamado herencia…

para definir los atributos de nuestra clase podemos hacerlo de la siguiente manera:

class Building:
    floors = 5
    hasElevator = True
    color = "green"
    offices = 10

así podemos crear un objeto con valores “por defecto”, esto muchas veces es importante tener en cuenta que podemos asignar valores a nuestros atributos, pero es aburrido que todos los edificios del mundo fueran iguales, ¿no crees?, entonces ¿como creamos una clase que podamos modificar cada uno de sus atributos?, podemos hacer uso del metodo especial __init__.

cada vez que instanciamos o creamos un objeto en python, este lo que hace es utilizar la funcion especial __init__ para definir cual seran los valores de los atributos de nuestra clase, si en el cuerpo de esta estan los atributos con valores, esta iniciará con dichos valores para cada atributo (valores por defecto) pero podemos cambiar estos una vez dentro del cuerpo de la funcion, por ejemplo.

class Building:
    floors = 5
    hasElevator = True
    color = "green"
    offices = 10

    def __init__(self, floors=None):
        if floors:
            self.floors = floors

De esta manera, al nosotros instanciar el objeto “Edificio”, si este tiene como parametros el numero de pisos dentro de su metodo constructor (ya veremos como se usa) este numero sobre-“escribe” nuestro valor por defecto de 5 pisos.

Screen Shot 2018-02-20 at 1.01.55 AM

Otro aspecto notable del __init__ es el uso de la palabra self, si pueden ver utilizamos self como primer parametro en nuestra funcion, esta variable apunta al objeto en si, y podemos acceder a los parámetros de nuestro objeto a través de ella como lo hicimos para poder sobre-“escribir” el numero de pisos si al crear el objeto se pasa como parámetro cuantos pisos tiene, eso hace a nuestros objetos mas “dinámicos”… un punto para python y no dejarnos morir de aburrimiento 😀

Cada una de las variables “building_a” y “building_b” son lo que llamamos objetos, estos fueron creados a partir de una clase llamada Building y poseen sus propios atributos (en nuestro caso el numero de pisos), pero y ¿que paso con nuestros “metodos“?, podriamos decir que __init__ es un metodo, aunque su comportamiento sea especial, hace parte de la clase pero no nos quedaremos allí, creemos un metodo para agregar nuevos pisos a nuestro edificio.

class Building:
    floors = 5
    hasElevator = True
    color = "green"
    offices = 10

    def __init__(self, floors=None):
        if floors:
            self.floors = floors

    def add_floor():
        self.floors += 1

Al hacer esto hemos agregado una nueva funcion llamada add_floor que lo que hace es agregar un nuevo piso (cambia) en nuestro atributo floors.

Bueno y hasta aquí ya hemos entendido varios conceptos de la POO y como podemos comenzar a exporar este mundo con python, en el próximo post hablaré un poco mas de que se puede realizar a fondo con la POO en python y como reutilizar código de una manera limpia y organizada, sin repetirse (DRY).

Hasta la proxima 😀