Python-Programacion Orientada a Objetos

51

Transcript of Python-Programacion Orientada a Objetos

Page 1: Python-Programacion Orientada a Objetos
Page 2: Python-Programacion Orientada a Objetos

Python: Programación Orientada a Objetosa Objetos

JESSE PADILLA AGUDELO

Ingeniero Electrónico

Page 3: Python-Programacion Orientada a Objetos

Licencia de la Presentación

3Python Manizales - Jesse Padilla Agudelo

Page 4: Python-Programacion Orientada a Objetos

Objetivos

• Dar un repaso general a la ProgramaciónOrientada a Objetos, comprendiendo demanera general conceptos tales comoObjetos, Clases, Métodos, Herencia,Objetos, Clases, Métodos, Herencia,

polimorfismo, etc.

• Conocer e implementar cada uno de losconceptos claves de la POO usando Pythoncomo lenguaje de programación.

4Python Manizales - Jesse Padilla Agudelo

Page 5: Python-Programacion Orientada a Objetos

Introducción

• Hoy en día la POO es un paradigma deprogramación fundamental para el desarrollo decualquier tipo de aplicación, por eso hoy en día sela mayoría de los lenguajes de alto nivel (ComoJava, C#, C++ entre otros) soportan esteparadigma y buscan explotarlo al máximo, PythonJava, C#, C++ entre otros) soportan esteparadigma y buscan explotarlo al máximo, Pythonno es la excepción de hecho en Python trabajarcon POO es muy fácil y agradable. Razón por lacual durante esta presentación analizaremos deforma detallada las virtudes de Python a la horade desarrollar software bajo este paradigma.

5Python Manizales - Jesse Padilla Agudelo

Page 6: Python-Programacion Orientada a Objetos

Índice

1. Conceptos de Programación Orientada a Objetos

2. Python: Clases y Objetos

3. Python: Herencia

4. Python: Herencia Múltiple4. Python: Herencia Múltiple

5. Python: Polimorfismo

6. Python: Encapsulación

7. Python: Clases de Nuevo Estilo

8. Python: Métodos Especiales

6Python Manizales - Jesse Padilla Agudelo

Page 7: Python-Programacion Orientada a Objetos

POO – Programación Orientada a Objetos

• La programación orientada a objetos es unparadigma de programación que buscarepresentar entidades u objetos agrupandorepresentar entidades u objetos agrupandodatos y métodos que puedan describir suscaracterísticas y comportamiento.

7Python Manizales - Jesse Padilla Agudelo

Page 8: Python-Programacion Orientada a Objetos

POO– Programación Orientada a Objetos

• La POO paradigma de programación en el quelos conceptos del mundo real relevantes paranuestro problema se modelan a través denuestro problema se modelan a través declases y objetos, y en el que nuestro programaconsiste en una serie de interacciones entreestos objetos.

8Python Manizales - Jesse Padilla Agudelo

Page 9: Python-Programacion Orientada a Objetos

Ventajas de la POO

• Fomenta la reutilización y extensión del código.

• Permite crear sistemas más complejos.

• Relacionar el sistema al mundo real.

• Facilita la creación de programas visuales.• Facilita la creación de programas visuales.

• Construcción de prototipos

• Agiliza el desarrollo de software

• Facilita el trabajo en equipo

• Facilita el mantenimiento del software

9Python Manizales - Jesse Padilla Agudelo

Page 10: Python-Programacion Orientada a Objetos

Modelo Orientado a Objetos

• Para entender la POO vamos a revisar unos conceptos básicos:

1. Objeto

2. Clase 2. Clase

3. Mensaje

4. Método

5. Interfaz

6. Herencia

10Python Manizales - Jesse Padilla Agudelo

Page 11: Python-Programacion Orientada a Objetos

POO: El Objeto

• Un objeto es una unidad que engloba en sí mismo características y comportamiento necesarias para procesar información. Cada objeto contiene datos y funciones. Y un objeto contiene datos y funciones. Y un programa se construye como un conjunto de objetos, o como un único objeto.

11Python Manizales - Jesse Padilla Agudelo

Page 12: Python-Programacion Orientada a Objetos

POO: El Objeto

• Ejemplo

– Carro BMW

• Características – 4 Ruedas Micheline– 4 Ruedas Micheline

– Motor BMW

– Caja de cambios de 7 Velocidades

– Color Azul

– 2 Espejos

12Python Manizales - Jesse Padilla Agudelo

Page 13: Python-Programacion Orientada a Objetos

POO: La Clase

• La clase es un modelo o prototipo que definelas variables y métodos comunes a todos losobjetos de cierta clase. También se puededecir que una clase es una plantilla genéricadecir que una clase es una plantilla genéricapara un conjunto de objetos de similarescaracterísticas.

13Python Manizales - Jesse Padilla Agudelo

Page 14: Python-Programacion Orientada a Objetos

POO: La Clase

• Ejemplo:

– Clase Vehículo– Numero de Ruedas

– Tipo de Motor

– Capacidad del Tanque de Gasolina

– Numero de Velocidades de la Caja de Cambios

– Color

14Python Manizales - Jesse Padilla Agudelo

Page 15: Python-Programacion Orientada a Objetos

POO: Mensaje

• El mensaje es el modo en que se comunicanlos objetos entre si.

• Ejemplo:

– Cuando llamemos a una función de un objeto,– Cuando llamemos a una función de un objeto,diremos que estamos enviando un mensaje a eseobjeto.

15Python Manizales - Jesse Padilla Agudelo

Page 16: Python-Programacion Orientada a Objetos

POO: Método

• Un Método es en POO se encarga de procesarlos mensajes que lleguen a un objeto, unmétodo no es otra cosa que una función oprocedimiento perteneciente a un objeto.procedimiento perteneciente a un objeto.

16Python Manizales - Jesse Padilla Agudelo

Page 17: Python-Programacion Orientada a Objetos

POO: Interfaz

• Las clases y por lo tanto también los objetos,tienen partes públicas y partes privadas.Algunas veces llamaremos a la parte públicade un objeto su interfaz. Se trata de la únicade un objeto su interfaz. Se trata de la únicaparte del objeto que es visible para el resto delos objetos, de modo que es lo único de lo quese dispone para comunicarse con ellos.

17Python Manizales - Jesse Padilla Agudelo

Page 18: Python-Programacion Orientada a Objetos

POO: Herencia

• La herencia es uno de los conceptos máscruciales en la POO. La herencia básicamenteconsiste en que una clase puede heredar susvariables y métodos a varias subclases. Estovariables y métodos a varias subclases. Estosignifica que una subclase, aparte de losatributos y métodos propios, tieneincorporados los atributos y métodosheredados de la superclase.

18Python Manizales - Jesse Padilla Agudelo

Page 19: Python-Programacion Orientada a Objetos

Python: Clases y Objetos

• Python está completamente orientado aobjetos: puede definir sus propias clases,heredar de las que usted defina o de lasincorporadas en el lenguaje, e instanciar lasclases que haya definido.clases que haya definido.

• En Python las clases se definen mediante lapalabra reservada class seguida del nombrede la clase, dos puntos (:) y a continuación,indentado, el cuerpo de la clase.

19Python Manizales - Jesse Padilla Agudelo

Page 20: Python-Programacion Orientada a Objetos

Python: Clases y Objetos

• Ejemplo:class Ejemplo: #1

pass #2

• En este ejemplo el nombre de la clase es Ejemplo• En este ejemplo el nombre de la clase es Ejemploy no hereda de otra clase. Por convención lasclases empiezan en Mayúscula.

• Esta clase no define atributos pero no puedeestar vacía para eso usamos la función pass,equivalente en otros lenguajes a usar {}

20Python Manizales - Jesse Padilla Agudelo

Page 21: Python-Programacion Orientada a Objetos

POO en Python: el método __init__

Las clases de Python no tienen constructores odestructores explícitos. Las clases de Python tienen algosimilar a un constructor: el método __init__.

21Python Manizales - Jesse Padilla Agudelo

Page 22: Python-Programacion Orientada a Objetos

POO en Python: el método __init__

• __init__ se llama inmediatamente tras crear una instanciade la clase.

• Sería tentador pero incorrecto denominar a esto elconstructor de la clase. Es tentador porque parece igual aun constructor (por convención, __init__ es el primermétodo definido para la clase), actúa como uno (es elmétodo definido para la clase), actúa como uno (es elprimer pedazo de código que se ejecuta en una instancia dela clase recién creada), e incluso suena como uno.

• Incorrecto, porque el objeto ya ha sido construido paracuando se llama a __init__, y ya tiene una referencia válidaa la nueva instancia de la clase. Pero __init__ es lo másparecido a un constructor que va a encontrar en Python, ycumple el mismo papel.

22Python Manizales - Jesse Padilla Agudelo

Page 23: Python-Programacion Orientada a Objetos

POO en Python: el método __init__

• El primer atributo o variable de cada método de clase,incluido __init__, es siempre una referencia a lainstancia actual de la clase.

• Por convención, este argumento siempre se denominaself. En el método __init__, self se refiere al objetoself. En el método __init__, self se refiere al objetorecién creado; en otros métodos de la clase, se refierea la instancia cuyo método ha sido llamado.

• Los métodos __init__ pueden tomar cualquiercantidad de argumentos, e igual que las funciones,éstos pueden definirse con valores por defecto,haciéndoles opcionales para quien invoca.

23Python Manizales - Jesse Padilla Agudelo

Page 24: Python-Programacion Orientada a Objetos

POO en Python: el método __init__

• Por convención, el primer argumento decualquier clase de Python (la referencia a lainstancia) se denomina self.

• Cumple el papel de la palabra reservada this enC++ o Java, pero self no es una palabra reservadaC++ o Java, pero self no es una palabra reservadaen Python, sino una mera convención.

• Aunque necesita especificar self de formaexplícita cuando define el método, no se

especifica al invocar el método; Python lo añadiráde forma automática.

24Python Manizales - Jesse Padilla Agudelo

Page 25: Python-Programacion Orientada a Objetos

POO en Python: Instanciación de las Clases

• Crear un objeto o instanciar una clase enPython es muy sencillo. Para instanciar unaclase, simplemente se invoca a la clase comosi fuera una función, pasando los argumentossi fuera una función, pasando los argumentosque defina el método __init__. El valor deretorno será el objeto recién creado.

25Python Manizales - Jesse Padilla Agudelo

Page 26: Python-Programacion Orientada a Objetos

POO en Python: Instanciación de las Clases

26Python Manizales - Jesse Padilla Agudelo

Page 27: Python-Programacion Orientada a Objetos

POO en Python: Borrar Objetos

• Crear instancias nuevas es sencillo, destruirlaslo es más. En general, no hay necesidad deliberar de forma explícita las instancias,porque se eliminan automáticamente cuandoporque se eliminan automáticamente cuandolas variables a las que se asignan salen deámbito. Son raras las pérdidas de memoria enPython.

27Python Manizales - Jesse Padilla Agudelo

Page 28: Python-Programacion Orientada a Objetos

POO con Python: Atributos de datos

• Python admite atributos de datos (llamados variables deinstancia en Java, y variables miembro en C++).

• Para hacer referencia a este atributo desde código que estéfuera de la clase, debe calificarlo con el nombre de lainstancia, instancia.data, de la misma manera quecalificaría una función con el nombre de su módulo.calificaría una función con el nombre de su módulo.

• Para hacer referencia a atributos de datos desde dentro dela clase, use self como calificador. Por convención, todos losatributos de datos se inicializan en el método __init__. Sinembargo, esto no es un requisito, ya que los atributos, aligual que las variables locales, comienzan a existir cuandose les asigna su primer valor.

28Python Manizales - Jesse Padilla Agudelo

Page 29: Python-Programacion Orientada a Objetos

POO en Python: Atributos de datos

29Python Manizales - Jesse Padilla Agudelo

Page 30: Python-Programacion Orientada a Objetos

POO en Python: Sobre Carga de Métodos

• C++ y Java admiten la sobrecarga de funciones por listade argumentos, es decir una clase puede tener variosmétodos con el mismo nombre, pero con argumentosen distinta cantidad, o de distinto tipo. Python noadmite sobrecarga de funciones. Los métodos sedefinen sólo por su nombre y hay un único método pordefinen sólo por su nombre y hay un único método porclase con un nombre dado.

• De manera que si una clase sucesora tiene un método__init__, siempre sustituye al método __init__ de suclase padre, incluso si éste lo define con una lista deargumentos diferentes. Y se aplica lo mismo acualquier otro método

30Python Manizales - Jesse Padilla Agudelo

Page 31: Python-Programacion Orientada a Objetos

POO en Python: Sobre Carga de Operadores

• La sobrecarga de operadores permite redefinirciertos operadores, como "+" y "-", parausarlos con las clases que hemos definido. Sellama sobrecarga de operadores porquellama sobrecarga de operadores porqueestamos reutilizando el mismo operador conun número de usos diferentes, y el compiladordecide cómo usar ese operador dependiendosobre qué opera.

31Python Manizales - Jesse Padilla Agudelo

Page 32: Python-Programacion Orientada a Objetos

POO en Python: Sobre Carga de Operadores

• __add__( self, other) -> Oper. Suma

• __sub__( self, other) -> Oper. Resta

• __mul__( self, other) -> Oper. Multiplicacion

• __rmul__( self, other) -> Oper. Multi. Por Escalar

• __floordiv__( self, other) -> Oper. division Redondeo• __floordiv__( self, other) -> Oper. division Redondeo

• __mod__( self, other) -> Oper. modulo

• __divmod__( self, other) -> Oper. division

• __pow__( self, other[, modulo]) -> Oper. Potencia

• __and__( self, other) -> Oper. and

• __xor__( self, other) -> Oper. xor

• __or__( self, other) -> Oper. or

32Python Manizales - Jesse Padilla Agudelo

Page 33: Python-Programacion Orientada a Objetos

POO en Python: Sobre Carga de Operadores

33Python Manizales - Jesse Padilla Agudelo

Page 34: Python-Programacion Orientada a Objetos

Python: Herencia

• Una de las principales propiedades de las claseses la herencia. Esta propiedad nos permite crearnuevas clases a partir de clases existentes,conservando las propiedades de la clase original yañadiendo otras nuevas.añadiendo otras nuevas.

• La nueva clase obtenida se conoce como clasederivada, y las clases a partir de las cuales sederiva, clases base. Además, cada clase derivadapuede usarse como clase base para obtener unanueva clase derivada.

34Python Manizales - Jesse Padilla Agudelo

Page 35: Python-Programacion Orientada a Objetos

Python: Herencia

• Definición de una clase heredada en Python.

class Instrumento:

pass

class Guitarra(Instrumento):class Guitarra(Instrumento):

pass

class Bajo(Instrumento):

pass

35Python Manizales - Jesse Padilla Agudelo

Page 36: Python-Programacion Orientada a Objetos

Herencia: El Método __init__

• Cuando creamos una clase derivada a partirde una clase padre y tenemos que la clasederivada proporciona o requiere su propiométodo __init__ , este método de la clasemétodo __init__ , este método de la clasederivada debe llamar explícitamente elmétodo __init__ de la clase base.

36Python Manizales - Jesse Padilla Agudelo

Page 37: Python-Programacion Orientada a Objetos

Herencia: El Método __init__

37Python Manizales - Jesse Padilla Agudelo

Page 38: Python-Programacion Orientada a Objetos

Python: Herencia Múltiple

class acuatico:

pass

class terrestre:class terrestre:

pass

class anfibio(acuatico, terrestre):

pass

38Python Manizales - Jesse Padilla Agudelo

Page 39: Python-Programacion Orientada a Objetos

Polimorfismo

• En programación orientada a objetos sedenomina polimorfismo a la capacidad quetienen los objetos de una clase de responderal mismo mensaje o evento en función de losal mismo mensaje o evento en función de losparámetros utilizados durante su invocación.Un objeto polimórfico es una entidad quepuede contener valores de diferentes tiposdurante la ejecución del programa. (wikipedia)

39Python Manizales - Jesse Padilla Agudelo

Page 40: Python-Programacion Orientada a Objetos

Python: Polimorfismo

• El polimorfismo es el proceso de la utilizaciónde un operador o función de diferentesformas para diferentes datos de entrada. Entérminos prácticos, el polimorfismo significatérminos prácticos, el polimorfismo significaque si la clase B hereda de la clase A, no tieneque heredar todo acerca de la clase A, quepuede hacer algunas de las cosas que haceuna clase diferente

40Python Manizales - Jesse Padilla Agudelo

Page 41: Python-Programacion Orientada a Objetos

Python: Polimorfismo

• A diferencia de Java y C++ el Polimorfismo enPython no es de gran importancia, dada sunaturaleza de lenguaje dinámico.

• En Python no existe la sobrecarga de métodos,• En Python no existe la sobrecarga de métodos,el ultimo método que se declare reemplazaraa los anteriores, aunque se puede conseguireste comportamiento usando métodos de #argumentos variable (*otros, **otros)

41Python Manizales - Jesse Padilla Agudelo

Page 42: Python-Programacion Orientada a Objetos

Encapsulación

• Para proteger a las variables demodificaciones no deseadas se introduce elconcepto de encapsulación. Los miembros deuna clase se pueden dividir en públicos yuna clase se pueden dividir en públicos yprivados. Los miembros públicos son aquellosa los que se puede acceder libremente desdefuera de la clase. Los miembros privados, porel contrario, solamente pueden ser accedidospor los métodos de la propia clase.

42Python Manizales - Jesse Padilla Agudelo

Page 43: Python-Programacion Orientada a Objetos

Encapsulación

• La Encapsulación se consigue en otros lenguajesde programación como Java y C++ utilizandomodificadores de acceso que definen sicualquiera puede acceder a esa método oatributo.atributo.

• En estos lenguajes tenemos los modificaciones:

• public -> hace visible los métodos y atributosfuera de la clase.

• private -> hace que los métodos y atributos solosean accesibles por métodos dentro de la clase.

43Python Manizales - Jesse Padilla Agudelo

Page 44: Python-Programacion Orientada a Objetos

Python: Encapsulación

• En Python no existen los modificadores deacceso.

• El acceso a una atributo o a los métodos vienedeterminado por su nombre: si el nombredeterminado por su nombre: si el nombrecomienza con dos guiones bajos (y no terminatambién con dos guiones bajos) se trata deuna atributo o método privada, si no es asiestos son públicos.

44Python Manizales - Jesse Padilla Agudelo

Page 45: Python-Programacion Orientada a Objetos

Python: Encapsulación

45Python Manizales - Jesse Padilla Agudelo

Page 46: Python-Programacion Orientada a Objetos

Python: Clases de Nuevo Estilo

• La ramas 2.x de Python tiene dos tipos de clases,las de estilo viejo y las de estilo nuevoconviviendo. Las de estilo viejo siguenexactamente el mismo modelo que cualquierprogramador de cualquier versión anteriorprogramador de cualquier versión anteriordebería conocer. Todas las características que seexplicarán a continuación se aplican sólo a lasclases de estilo nuevo. Eventualmente se dejaránde soportar las clases de estilo viejo, en Python3.0

46Python Manizales - Jesse Padilla Agudelo

Page 47: Python-Programacion Orientada a Objetos

Python: Clases de Nuevo Estilo

• ¿Cómo se define una clase de estilo nuevo? Se haceheredando de una clase existente. La mayoría de lostipos internos de Python, como enteros, listas,diccionarios, e incluso archivos son ahora clases deestilo nuevo. Hay además una clase de estilo nuevollamada 'object' que se convierte en la clase base parallamada 'object' que se convierte en la clase base paratodos los tipos internos, de modo que si no queremosheredar de un nuevo tipo interno se puede heredar deeste:class MiClase(object):

def __init__(self):

pass

47Python Manizales - Jesse Padilla Agudelo

Page 48: Python-Programacion Orientada a Objetos

Preguntas

48Python Manizales - Jesse Padilla Agudelo

Page 49: Python-Programacion Orientada a Objetos

Referencias

• Python para todos, Raúl González Duque

• Inmersión en Python, MARK PILGRIM –FRANCISCO CALLEGO – RICARDO CÁRDENAS.

• Aprenda a Pensar Como un Programador con• Aprenda a Pensar Como un Programador con

Python, ALLEN DOWNEY - JEREY ELKNER –CHIRIS MEYER

49Python Manizales - Jesse Padilla Agudelo

Page 50: Python-Programacion Orientada a Objetos

Enlaces

• www.python.org• http://es.wikipedia.org/wiki/Programaci%C3%B3

n_orientada_a_objetos• http://www.python.org/doc/2.5.2/ref/numeric-

types.htmltypes.html• http://blog.rvburke.com/2006/11/22/programaci

on-orientada-a-objetos-en-python/• http://www.freenetpages.co.uk/hp/alan.gauld/sp

anish/tutclass.htm• http://juanjoalvarez.net/?q=cambiospython

50Python Manizales - Jesse Padilla Agudelo

Page 51: Python-Programacion Orientada a Objetos

51Python Manizales - Jesse Padilla Agudelo