Programacion Orientada a Objetos al Estilo Python Parte 1

Introduccion

La POO es un paradigma de la programacion muy popular en el cual se abstraen objetos del mundo real  (es decir, se toman sus propiedades) así como sus interacciones.

De ésta forma podemos tener en una clase o modulo (en python) llamado Auto con las propiedades “color, motor,velocidadMaxima, gasolina” y sus interacciones como “acelerar o frenar”.

Claro, esto es muy a grandes rasgos y no es el motivo del post, sino el como ese paradigma se aplica a Python o al menos como he logrado entender como funciona.

Python no es Java

Los que ya llevan tiempo desarrollando en Java o C# y quieren entrar al mundo de Python entenderan lo complicado que aveces resulta pasar de lo que se hace en esos lenguajes a lo que se hace en Python y una de esas cosas son los Getters and Setters.

Éstos metodos regresan un valor del objeto o bien lo establecen de acuerdo a lo que se requiera en tiempo de ejecucion.

La verdad es que en Python más de una vez leí y escuche que “En Python no son necesarios”, y es que en la Forma Python  o “The Python Way”   las cosas son tan dinamicas como cambiar el valor directamente o mostrarlo y usarlo ya que tener atributos privados puede limitar el potencial del codigo, según dicen.

Claro que los que venimos de Java tendremos muchas razones para ocultar o encapsular los atributos de forma que solo sean accesibles mediante un get o un set.

Es decir, mientras en java tenemos:


public static void main(String[]args){
 Alumno alumno=new Alumno("Pedro");
 System.out.println(alumno.getNombre());
 alumno.setNombre("Juan");
}

En Python tenemos


if __name__=='__main__':
 alumno=Alumno("Pedro")
 print alumno.nombre
 alumno.nombre="Juan"

Y esto es porque los atributos o propiedades en Python por defecto son publicos, una de las principales diferencias de Python con otros lenguajes orientados a objetos.

Definiendo una Clase

Para empezar vamos a definir una clase en Python con un ejemplo muy sencillo, una clase que define los atributos de un alumno como Nombre, Edad y Grado:

Alumno.py


class Alumno(object):

 def __init__(self,nombre,edad,grado):
 self.nombre=nombre
 self.edad=edad
 self.grado=grado
 pass

 def __str__(self):
 return "Nombre: "+self.nombre+" - Edad: "+str(self.edad)+" - Grado: "+str(self.grado)

Como podemos notar se inicia con class que indica que el modulo es una clase de nombre Alumno y hereda de la clase object.

En java, por ejemplo, todas las clases heredan de Object más la que indiquemos.

Por otra parte en python es necesario indicar ésta herencia y separado por comas las demás clases que hereda tomando en cuenta que Python si permite la herencia multiple.

__init__(self):

Más abajo tenemos una de las palabras propias de python: __init__(self)

Éste metodo es el constructor de la clase, por así decirlo, y se lanza cuando la clase es instanciada.

Una nota muy importante de éste metodo es el self, que indica que se trata del objeto por si mismo, en Java si existe, pero es implicito, mientras que en Python si es necesario definir el atributo self.

Dentro del __init__ se pueden definir los parametros de la clase como se ve en el ejemplo y siempre acompañados de la palabra self.

Digamos que el self es un equivalente del this en java, pero como digo, la diferencia es que para declarar atributos de la clase es necesario iniciar con self.<atributo>.

Pass es el equivalente a return, aunque no significa que no exista el return en python, solo indica que termina la definicion del metodo ahí.

__str__(self):

Finalmente, como es normal en los objetos, es necesario obtener la informacion resumida de éste, en java tenemos el metodo toString() que nos regresa una cadena de texto con la informacion del objeto.

En Python se puede sobrecargar el metodo que en el caso de python se llama __str__,  con el valor de retorno que vamos a dar.

Notese  que vuelve a aparecer la palabra self, la verdad es que al principio puede ser confuso que aparezca “self” en la definicion de nuestros metodos, pero veamoslo asi..

El self viene implicito (como ya explique) en lenguajes como Java, si en Java tienes un metodo llamado get(), en realidad lo que tienes es un  get(self), que indica que vas a ejecutar ese metodo del objeto que esta instanciado.

Como dije antes, en Python es necesario colocar el “self” donde se requiera, y es una regla que todos los metodos y constructores tengan como primer parametro self aún cuando no tenga mas parametros.

Al hacer una llamada al metodo no se debe colocar “self”  

Por ejemplo, para usar mi clase que acabo de crear..


if __name__='__main__':
 alumno=Alumno("Pedro",13,6)
 print alumno

En éste caso la primer instruccion es un equivalente al metodo “main” de java y se ejecutara lo que esté dentro del if.

Más abajo inicializo mi clase con los parametros que requiere , nota que no se escribe “self” en ningun lado.

Y finalmente llamo al metodo __str__ al pedir que se imprima el objeto.

Cuya salida nos dará:

Alumno: Pedro – Edad: 13 – Grado: 6

 

Esto es para la primer parte de lo que vaya enterandome al respecto, la verdad es que apenas estoy aprendiendo, claro que antes de hacer el post reforse mucho lo que se esta mostrando.

Aún así si hay una correccion no dudes en comentarlo 🙂

Anuncios

Un comentario en “Programacion Orientada a Objetos al Estilo Python Parte 1

  1. Pingback: DuckTyping: Si suena y camina como un pato, es un pat « Snake's Code

Cuentanos tu reaccion

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s