Clases y objetos en python (Programacion Orientada a Objetos)

Anuncio
Clases y objetos en python (Programacion Orientada
a Objetos)
pythondiario.com /2014/10/clases-y-objetos-en-python-programacion.html
Python es un lenguaje de programación
orientada a objetos (POO). La programación
orientada a objetos tiene sus raíces en la década del
60, pero es en los 80 que se convierte en el
principal paradigma de la programación de un
nuevo software.
Hasta ahora los ejercicios y ejemplos que he
utilizado han sido utilizando la programación
funcional (realizando funciones que den solución a
los problemas). En la programación orientada a
objetos la atención se centra en la creación de
objetos que contienen los datos y funcionalidad
juntos.
Definiciones necesarias:
¿Qué es un Objeto?
Los objetos son la clave para entender la
Programación Orientada a Objetos. Si miramos a
Programación Orientada a Objetos
nuestro alrededor encontraremos un sin fin de
objetos de la vida real: perro, escritorio, televisor, bicicleta, etc...
¿Qué es un Atributo?
Los atributos o propiedades de los objetos son las características que puede tener un objeto: Si el
objeto fuera Perro, los atributos podrían ser: tamaño, edad, color, raza, etc...
¿Qué es un Método?
Los métodos son la acción o función que realiza un objeto. Si nuestro objeto es Perro, los métodos
pueden ser: caminar, ladrar, saltar, dormir, etc...
¿Qué es una Clase?
Con todos los conceptos anteriores explicados, se puede decir que una clase es una plantilla
genérica de un objeto. La clase proporciona variables iniciales de estado (donde se guardan los
atributos) e implementaciones de comportamiento (métodos)
¿Qué es una Instancia?
Ya sabemos que una clase es una estructura general del objeto. Por ejemplo, podemos decir que la
clase Mascota necesita tener un nombre y una especie, pero no nos va a decir cual es el nombre y
cual es la especie, es aquí donde entran las instancias. Una instancia es una copia específica de la
clase con todo su contenido.
Ejemplo: Mateo = Mascota ("Mateo", "Gato")
Aquí podemos decir que Mateo es una instancia de la clase Mascota.
Las clases nos dan la posibilidad de crear estructuras de datos más complejas. En nuestro ejemplo
crearemos una clase Mascotas que realizará un seguimiento del nombre y la especie (que
pasaremos como atributos).
Ejemplo de clases y objetos en python:
Como definir una clase en Python
Linea 5
class Mascota(object):
Aquí es donde empezamos a crear
nuestra clase (lo hacemos con la palabra
class). La segunda palabra ( Mascota) es
el nombre que le daremos a nuestra clase.
La tercera palabra que se encuentra
dentro de los paréntesis (object) se
conoce con el nombre de herencia (mas
tarde hablaré sobre el concepto de
herencia). Lo que debemos saber es que
"object" es una variable especial en
python que se utiliza de herencia cuando
creamos una nueva clase en python.
Estructura de una Clase
Lineas 7-9
Definiendo clase Mascota en Python
def __init__(self, nombre, especie):
----self.nombre = nombre
----self.especie = especie
Cuando creamos una nueva mascota, necesitamos inicializarla con un nombre y una especie. El
método __init__ (método especial para las funciones que forman parte de una clase) es una función
especial en python que inicializa la clase con los atributos que nosotros le pasemos. Por ejemplo: si
corremos el código Teo = Mascota("Teo", "Perro") , el método __init__ es llamado con los valores Teo,
"Teo" y "Perro" en las variables self, nombre y especies, respectivamente.
La variable self es una instancia de la clase y es bueno aclarar que no es una palabra reservada de
python, cualquier etiqueta utilizada como primer parámetro tendría el mismo valor (se desaconseja el
uso de otras etiquetas por un tema de convención). O sea que, cada vez que declaremos un método
en python, vamos a tener que agregarle la variable self para que cuando sea invocado el método,
Python pase el objeto instanciado y opere con los valores actuales de esa instancia.
También en estas líneas almacenamos el atributo nombre en el parámetro nombre (self.nombre =
nombre) y también (self.especie = especie).
Lineas 11-15
def darNombre(self):
---- return self.nombre
def darEspecie(self):
---- return self.especie
Podemos definir métodos que necesitemos para mostrar e interactuar con los contenidos de las
instancias. El método darNombre toma una instancia de la clase Mascota y nos devuelve el nombre
de la misma. Lo mismo pasa con el método darEspecie. Una ves mas necesitamos el parámetro self
para que la función sepa con que instancia de Mascota trabajar y así poder averiguar su contenido.
Lineas 17-18
def __str__(self):
---- return "%s es un %s" % (self.nombre, self.especie)
El método __str__ es una función especial de python (nos podemos dar cuenta de que los métodos
especiales de python comienzan y terminan con un doble guión bajo).
Este método nos proporciona una cadena (informal) de la representación del objeto. En nuestro caso,
si definimos la instancia Teo = Mascota("Teo", "Perro"), el método __str__ nos va a devolver la
cadena: Teo es un Perro.
Interactuando con nuestra primera clase Mascota
Ahora vamos a ver como podemos interactuar en consola con la clase Mascota que hemos creado.
Para hacer esto debemos abrir la consola y pararnos en el directorio donde tenemos guardado nuestro
archivo Mascotas.py. Una ves ahí escribimos "python" para abrir el shell interactivo de python.
Lo primero que hacemos es importar la clase Mascota del archivo Mascotas.py
>>>from Mascotas import Mascota
Luego creamos una instancia de la clase Mascota y la llamamos tito
>>>tito = Mascota("Tito", "Perro")
Después devolvemos la cadena "Tito es un Perro" de dos maneras diferentes: la primera con el
nombre de la instancia + el método:
>>>print "Tito es un %s" % tito.darEspecie()
La segunda: llamamos la clase + el método y le pasamos entre paréntesis la instancia (tito)
>>>print "Tito es un %s" % Mascota.darEspecie(tito)
El último print nos arroja un error porque necesitamos pasar la instancia (tito).
Otros ejemplos de la clase Mascota
Para probar seguimos utilizando la consola de python y el archivo llamado Mascotas.py donde se
encuentra nuestra clase Mascota:
Ejemplo 1
>>>from Mascotas import Mascota
>>>rocco = Mascota("Rocco", "Perro")
>>>rocco.darNombre()
"Rocco"
>>>rocco.darEspecie()
"Perro"
>>>print rocco
Rocco es un Perro
Interactuando con la clase Mascota
Ejemplo 2
>>>from Mascotas import Mascota
>>>tito = Mascota("Tito", "Gato")
>>>tito.darNombre()
"Tito"
>>>tito.darEspecie()
"Gato"
>>>print tito
Tito es un Gato
Ejemplo 3
>>>from Mascotas import Mascota
>>>pepe = Mascota("Pepe", "Pato")
>>>pepe.darNombre()
"Pepe"
>>>pepe.darEspecie()
"Pato"
>>>print pepe
"Pepe es un Pato"
Crear subclases de la clase Mascota (herencia)
A veces no nos alcanza definiendo solo una clase como Mascota. Por ejemplo, algunas mascotas
pueden ser perros y a la mayoría de ellos les gusta perseguir gatos, y tal ves nosotros queramos
saber a que perro le gusta perseguir los gatos y a que perro no. Podemos hacer otra clase Perro que
va a heredar la clase Mascota, esto no solo nos dará la estructura de la clase Mascota, si no que
también podremos agregar una estructura específica para la clase Perro.
Clase Perro en python
Clase Perro:
Definimos la clase con la palabra class seguido del nombre de la clase (en nuestro caso Perro) y luego
entre paréntesis colocamos la clase que queremos heredar (en nuestro caso es la clase Mascota).
Queremos especificar que toda la clase perro va a tener como especie "Perro" y también si al perro le
gusta perseguir a los gatos. Para ello debemos escribir la función de inicialización propia. También
tenemos que llamar a la función de inicialización de la clase padre porque queremos que el nombre y
la especie se inicialicen.
Podemos definir una subclase igual para los gastos:
Clase Gato en python
Examinando diferencias entre Perro y Mascota:
>>>from Mascotas import Mascota, Perro
>>>mascota = Mascota("Falucho", "Perro")
>>>perro = Perro("Falucho", True)
La función que se utilizará a continuación (isinstance), es una función especial que chequea si una
instancia es de un determinado tipo de clase. Podemos ver que mascota es una instancia de
Mascota, y perro es una instancia de las dos clases ( Mascota, Perro).
>>>isinstance(mascota, Mascota)
True
>>>isinstance(mascota, Perro)
False
>>>isinstance(perro, Mascota)
True
>>>isinstance(perro, Perro)
True
Esto se da porque mascota es una Mascota, pero no un Perro, no podemos llamar la función
persigueGatos porque la clase Mascota no tiene este método. Pero si podemos llamar el método
persigueGatos en perro porque se define para la clase Perro. Si podemos llamar el método
darNombre en mascota y perro porque los dos son una instancia de Mascota aunque darNombre
no esté definido explícitamente en la clase Perro (hereda de Mascota sus métodos).
Perros y Gatos
Crearemos algunos gatos y perros:
>>> from Mascotas import Gato, Perro
>>> pluto = Perro("Pluto", True)
>>> snoopy = Perro("Snoopy", False)
>>> tom = Gato("Tom", True)
>>> felix = Gato("Felix", False)
>>> print pluto
Pluto es un Perro
>>> print snoopy
Snoopy es un Perro
>>> print tom
Tom es un Gato
>>> print felix
Felix es un Gato
>>> print "%s persigue gatos: %s" % (pluto.darNombre(), pluto.persigueGatos())
Pluto persigue gatos: True
>>> print "%s persigue gatos: %s" % (snoopy.darNombre(), snoopy.persigueGatos())
Snoopy persigue gatos: False
>>> print "%s odia los perros: %s" % (tom.darNombre(), tom.odiaPerros())
Tom odia los perros: True
>>> print "%s odia los perros: %s" % (felix.darNombre(), felix.odiaPerros())
Felix odia los perros: False
Descargar