Clase4_Python-CTIC

2,247 views

Published on

0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
2,247
On SlideShare
0
From Embeds
0
Number of Embeds
877
Actions
Shares
0
Downloads
62
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

Clase4_Python-CTIC

  1. 1. PYTHON Universidad Nacional de Ingenieria Centro de Tecnologias de Informacion y Comunicaciones Facultad de Ciencias Abraham Zamudio Ch.
  2. 2. PYTHON Clase 4 Abraham Zamudio Ch. abraham.zamudio@gmail.com
  3. 3. Programacion Orientada a Objetos en PYTHON
  4. 4. Introducción Hoy en día la POO es un paradigma de programación fundamental para el desarrollo de cualquier tipo de aplicación, por eso hoy en día la mayoría de los lenguajes de alto nivel (Como Java, C#, C++ entre otros) soportan este paradigma y buscan explotarlo al máximo, Python no es la excepción de hecho en Python trabajar con POO es muy fácil y agradable.
  5. 5. POO – Programación Orientada a Objetos La programación orientada a objetos es un paradigma de programación que busca representar entidades u objetos agrupando datos y métodos que puedan describir sus características y comportamiento.
  6. 6. POO– Programación Orientada a Objetos La POO es un paradigma de programación en el que los conceptos del mundo real relevantes para nuestro problema se modelan a través de clases y objetos, y en el que nuestro programa consiste en una serie de interacciones entre estos objetos.
  7. 7. 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. • Construcción de prototipos • Agiliza el desarrollo de software • Facilita el trabajo en equipo • Facilita el mantenimiento del software
  8. 8. POO : Ejemplo class Mensaje: def __init__(self, string): self.text = string def printAll(self): print self.text print type(self) def deleteAll(self): self.text = ""
  9. 9. Modelo Orientado a Objetos Para entender la POO vamos a revisar unos conceptos básicos: 1. Objeto 2. Clase 3. Mensaje 4. Método 5. Interfaz 6. Herencia
  10. 10. 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 programa se construye como un conjunto de objetos, o como un único objeto.
  11. 11. POO: El Objeto • Ejemplo – Carro BMW • Características – 4 Ruedas Micheline – Motor BMW – Caja de cambios de 7 Velocidades – Color Azul – 2 Espejos
  12. 12. POO: La Clase • La clase es un modelo o prototipo que define las variables y métodos comunes a todos los objetos de cierta clase. También se puede decir que una clase es una plantilla genérica para un conjunto de objetos de similares características.
  13. 13. 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
  14. 14. POO: La Clase Definir una clase en Python es sencillo. Al igual que con las funciones, no existe una definición separada de interfaz. Simplemente defines la clase y empiezas a escribir código. Una clase de Python empieza con la palabra reservada class, seguida del nombre de la clase. Técnicamente, eso es todo lo necesario, ya que una clase no tiene por qué derivar de ninguna otra.
  15. 15. POO: La Clase class PapayaWhip: ① Pass ② ① El nombre de esta clase es PapayaWhip y no deriva de ninguna otra clase. Los nombres de las clases suelen incluir mayúsculas DeEstaManera, pero es sólo una convención, no un requisito. ② Probablemente ya te lo hayas imaginado, pero todo dentro de una clase va sangrado, igual que el código de una función, de una sentencia if, un bucle for, o cualquier otro bloque de código. La primera línea que no esté sangrada, queda fuera de la clase.
  16. 16. POO: La Clase Esta clase PapayaWhip no define ningún método o atributo pero, sintácticamente, debe haber algo en su definición y de ahí la sentencia pass. Es una palabra reservada de Python que significa sencillamente “caminen, nada que ver aquí”. Es una sentencia que no hace nada y es un buen sustituto para el código de funciones o clases que estés esbozando. La sentencia pass de Python es como un bloque vacío en Java o C ({}).
  17. 17. POO: La Clase Muchas clases derivan de otras (heredan de ellas), pero no en este caso. Muchas clases definen métodos, pero no ésta. No hay nada que una clase de Python deba tener imperiosamente, aparte de un nombre. En particular, los programadores de C++ puede que encuentren extraño que las clases de Python no tengan constructores y destructores explícitos. Aunque no es estrictamente necesario, las clases en Python pueden tener algo similar a un constructor: el método __init__().
  18. 18. POO: Mensaje • El mensaje es el modo en que se comunican los objetos entre si. • Ejemplo: – Cuando llamemos a una función de un Objeto, diremos que estamos enviando un mensaje a ese objeto
  19. 19. POO: Método • Un Método en POO se encarga de procesar los mensajes que lleguen a un objeto, un método no es otra cosa que una función o procedimiento perteneciente a un objeto.
  20. 20. 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ública de un objeto su interfaz. Se trata de la única parte del objeto que es visible para el resto de los objetos, de modo que es lo único de lo que se dispone para comunicarse con ellos.
  21. 21. POO: Herencia • La herencia es uno de los conceptos más cruciales en la POO. La herencia básicamente consiste en que una clase puede heredar sus variables y métodos a varias subclases. Esto significa que una subclase, aparte de los atributos y métodos propios, tiene incorporados los atributos y métodos heredados de la superclase.
  22. 22. Python: Clases y Objetos • Python está completamente orientado a objetos: puede definir sus propias clases, heredar de las que usted defina o de las incorporadas en el lenguaje, e instanciar las clases que haya definido. • En Python las clases se definen mediante la palabra reservada class seguida del nombre de la clase, dos puntos (:) y a continuación, indentado, el cuerpo de la clase.
  23. 23. Python: Clases y Objetos • Ejemplo: class Ejemplo: pass • En este ejemplo el nombre de la clase es Ejemplo y no hereda de otra clase. Por convención las clases empiezan en Mayúscula. • Esta clase no define atributos pero no puede estar vacía para eso usamos la función pass, equivalente en otros lenguajes a usar {}
  24. 24. POO en Python: el método __init__ Las clases de Python no tienen constructores o destructores explicitos. Las clases de Python tienen algo similar a un constructor: el metodo __init__.
  25. 25. POO en Python: el método __init__ class Fib: '''iterador que cede números en la secuencia de Fibonacci''' ① def __init__(self, max): ② ① Las clases también pueden (y deberían) tener docstrings, al igual que módulos y funciones. ② El método __init__() se invoca inmediatamente después de que se cree una instancia de la clase. Sería tentador — pero técnicamente incorrecto — decir que es el “constructor” de la clase. Es tentador porque parece un constructor de C++ (por convención, el método __init__() es el primero que se define para la clase), actúa como si lo fuese (es la primera secuencia de código ejecutada sobre una instancia de la clase recién creada) e incluso suena a constructor. Incorrecto, porque el objeto ya ha sido construido para cuando se invoca __init__() y ya tienes una referencia válida a la nueva instancia de la clase.
  26. 26. POO en Python: el método __init__ El primer argumento de cada método de clase, __init__() incluido, es siempre una referencia a la instancia actual de la clase. Por convención, a este argumento se le llama self. Este argumento juega el papel de la palabra reservada this en c++ o Java, pero self no es una palabra reservada en Python, sino una mera convención. Sin embargo, haz el favor de no llamarlo de otra manera que no sea self, ya que es una convención extremadamente extendida. En el método __init__(), self se refiere al objeto recién creado; en otros métodos de la clase, se refiere a la instancia cuyo método ha sido invocado. Aunque debes especificar self de forma explícita al definir el método, no lo especificas al invocarlo; Python lo añade por ti de forma automática.
  27. 27. POO en Python: el método __init__ • __init__ se llama inmediatamente tras crear una instancia de la clase. • Sería tentador pero incorrecto denominar a esto el constructor de la clase. Es tentador porque parece igual a un constructor (por convención, __init__ es el primer método definido para la clase), actúa como uno (es el primer pedazo de código que se ejecuta en una instancia de la clase recién creada), e incluso suena como uno. • Incorrecto, porque el objeto ya ha sido construido para cuando se llama a __init__, y ya tiene una referencia válida a la nueva instancia de la clase. Pero __init__ es lo más parecido a un constructor que va a encontrar en Python, y cumple el mismo papel.
  28. 28. 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 la instancia actual de la clase. • Por convención, este argumento siempre se denomina self. En el método __init__, self se refiere al objeto recién creado; en otros métodos de la clase, se refiere a la instancia cuyo método ha sido llamado. • Los métodos __init__ pueden tomar cualquier cantidad de argumentos, e igual que las funciones, éstos pueden definirse con valores por defecto, haciéndoles opcionales para quien invoca.
  29. 29. POO en Python: el método __init__ • Por convención, el primer argumento de cualquier clase de Python (la referencia a la instancia) se denomina self. • Cumple el papel de la palabra reservada this en C++ o Java, pero self no es una palabra reservada en Python, sino una mera convención. • Aunque necesita especificar self de forma explícita cuando define el método, no se especifica al invocar el método; Python lo añadirá de forma automática.
  30. 30. POO en Python: Instanciación de las Clases Crear un objeto o instanciar una clase en Python es muy sencillo. Para instanciar una clase, simplemente se invoca a la clase como si fuera una función, pasando los argumentos que defina el método __init__. El valor de retorno será el objeto recién creado.
  31. 31. POO en Python: Instanciación de las Clases
  32. 32. fibonacci2.py '''Iterador de Fibonacci''' class Fib: '''iterador que cede números en la secuencia de Fibonacci''' def __init__(self, max): self.max = max def __iter__(self): self.a = 0 self.b = 1 return self def __next__(self): fib = self.a if fib > self.max: raise StopIteration self.a, self.b = self.b, self.a + self.b return fib
  33. 33. POO en Python: Instanciación de las Clases La instanciación de clases en Python es my sencilla. Para instanciar una clase, la invocas como si se tratase de una función, pasándole los argumentos que precise el método __init__(). El valor de retorno será el objeto recién creado.
  34. 34. POO en Python: Instanciación de las Clases >>> import fibonacci2 >>> fib = fibonacci2.Fib(100) ① >>> fib ② <fibonacci2.Fib object at 0x00DB8810> >>> fib.__class__ ③ <class 'fibonacci2.Fib'> >>> fib.__doc__ ④ 'iterador que cede números en la secuencia de Fibonacci'
  35. 35. POO en Python: Instanciación de las Clases ① Estamos creando una instancia de la clase Fib (definida en el módulo fibonacci2) y asignando la instancia recién creada a la variable fib. Estamos pasándole un parámetro, 100, que acabará como argumento max para el método __init__() de Fib. ② Ahora fib es una instancia de la clase Fib. ③ Cada instancia de una clase porta un atributo, __class__, que es el objeto de la clase. Puede que los programadores de Java estén familiarizados con la clase Class, que contiene métodos como getName() y getSuperclass() para obtener información de metadatos de un objeto. En Python, este tipo de información está disponible mediante atributos, pero la idea es la misma. ④ Puedes acceder a la docstring de la instancia de la misma manera que a la de una función o un módulo. Todas las instancias de una clase comparten la misma docstring.
  36. 36. POO en Python: Instanciación de las Clases En Python, basta invocar una clase como si fuera una función para crear una nueva instancia de la clase. No hay operador new explícito como en c+ + o Java.
  37. 37. POO en Python: Borrar Objetos Crear instancias nuevas es sencillo, destruirlas lo es más. En general, no hay necesidad de liberar de forma explícita las instancias, porque se eliminan automáticamente cuando las variables a las que se asignan salen de ámbito. Son raras las pérdidas de memoria en Python.
  38. 38. POO con Python: Atributos de datos • Python admite atributos de datos (llamados variables de instancia 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 la instancia, instancia.data, de la misma manera que calificaría una función con el nombre de su módulo. • Para hacer referencia a atributos de datos desde dentro de la clase, use self como calificador. Por convención, todos los atributos de datos se inicializan en el método __init__. Sin embargo, esto no es un requisito, ya que los atributos, al igual que las variables locales, comienzan a existir cuando se les asigna su primer valor.
  39. 39. POO en Python: Atributos de datos
  40. 40. POO en Python: Sobre Carga de Métodos • C++ y Java admiten la sobrecarga de funciones por lista de argumentos, es decir una clase puede tener varios métodos con el mismo nombre, pero con argumentos en distinta cantidad, o de distinto tipo. Python no admite sobrecarga de funciones. Los métodos se definen sólo por su nombre y hay un único método por clase con un nombre dado. • De manera que si una clase sucesora tiene un método __init__, siempre sustituye al método __init__ de su clase padre, incluso si éste lo define con una lista de argumentos diferentes. Y se aplica lo mismo a cualquier otro método
  41. 41. POO en Python: Sobre Carga de Operadores • La sobrecarga de operadores permite redefinir ciertos operadores, como "+" y "-", para usarlos con las clases que hemos definido. Se llama sobrecarga de operadores porque estamos reutilizando el mismo operador con un número de usos diferentes, y el compilador decide cómo usar ese operador dependiendo sobre qué opera.
  42. 42. 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 • __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
  43. 43. POO en Python: Sobre Carga de Operadores
  44. 44. Python: Herencia •Una de las principales propiedades de las clases es la herencia. Esta propiedad nos permite crear nuevas clases a partir de clases existentes, conservando las propiedades de la clase original y añadiendo otras nuevas. •La nueva clase obtenida se conoce como clase derivada, y las clases a partir de las cuales se deriva, clases base. Además, cada clase derivada puede usarse como clase base para obtener una nueva clase derivada.
  45. 45. Python: Herencia • Definición de una clase heredada en Python. class Instrumento: pass class Guitarra(Instrumento): pass class Bajo(Instrumento): pass
  46. 46. Python: Herencia Múltiple class acuatico: Pass class terrestre: Pass class anfibio(acuatico, terrestre): pass
  47. 47. Polimorfismo • En programación orientada a objetos se denomina polimorfismo a la capacidad que tienen los objetos de una clase de responder al mismo mensaje o evento en función de los parámetros utilizados durante su invocación. Un objeto polimórfico es una entidad que puede contener valores de diferentes tipos durante la ejecución del programa. (wikipedia)
  48. 48. Python: Polimorfismo • El polimorfismo es el proceso de la utilización de un operador o función de diferentes formas para diferentes datos de entrada. En términos prácticos, el polimorfismo significa que si la clase B hereda de la clase A, no tiene que heredar todo acerca de la clase A, que puede hacer algunas de las cosas que hace una clase diferente
  49. 49. Python: Polimorfismo • A diferencia de Java y C++ el Polimorfismo en Python no es de gran importancia, dada su naturaleza de lenguaje dinámico. • En Python no existe la sobrecarga de métodos, el ultimo método que se declare reemplazara a los anteriores, aunque se puede conseguir este comportamiento usando métodos de # argumentos variable (*otros, **otros)
  50. 50. Encapsulación • Para proteger a las variables de modificaciones no deseadas se introduce el concepto de encapsulación. Los miembros de una clase se pueden dividir en públicos y privados. Los miembros públicos son aquellos a los que se puede acceder libremente desde fuera de la clase. Los miembros privados, por el contrario, solamente pueden ser accedidos por los métodos de la propia clase.
  51. 51. Encapsulación • La Encapsulación se consigue en otros lenguajes de programación como Java y C++ utilizando modificadores de acceso que definen si cualquiera puede acceder a esa método o atributo. • En estos lenguajes tenemos los modificaciones: • public -> hace visible los métodos y atributos fuera de la clase. • private -> hace que los métodos y atributos solo sean accesibles por métodos dentro de la clase.
  52. 52. Python: Encapsulación • En Python no existen los modificadores de Acceso. • El acceso a una atributo o a los métodos viene determinado por su nombre: si el nombre comienza con dos guiones bajos (y no termina también con dos guiones bajos) se trata de una atributo o método privada, si no es asi estos son públicos.
  53. 53. Python: Encapsulación
  54. 54. Python: Clases de Nuevo Estilo • La ramas 2.x de Python tiene dos tipos de clases, las de estilo viejo y las de estilo nuevo conviviendo. Las de estilo viejo siguen exactamente el mismo modelo que cualquier programador de cualquier versión anterior debería conocer. Todas las características que se explicarán a continuación se aplican sólo a las clases de estilo nuevo. Eventualmente se dejarán de soportar las clases de estilo viejo, en Python 3.0
  55. 55. Python: Clases de Nuevo Estilo • ¿Cómo se define una clase de estilo nuevo? Se hace heredando de una clase existente. La mayoría de los tipos internos de Python, como enteros, listas, diccionarios, e incluso archivos son ahora clases de estilo nuevo. Hay además una clase de estilo nuevo llamada 'object' que se convierte en la clase base para todos los tipos internos, de modo que si no queremos heredar de un nuevo tipo interno se puede heredar de este: class MiClase(object): def __init__(self): pass
  56. 56. POO en PYTHON # Descripcion: # Programa que a muestra un ejemplo de como se define # una clase y luego se instancia la misma a traves de un objeto # y la forma de enviar datos por parametros. # # Creamos la clase Bolsa class Bolsa: # inicializamos la lista def __init__(self, color): self.datos = [] self.color = color # creamos un metodo para ingresar un valor una ves def agregar(self, x): self.datos.append(x) # creamos un metodo para ingresar un valor 2 veces def agregarDosVeces(self, x): self.datos.append(x) self.datos.append(x) # creamos un metodo para mostrar el contenido de la bolsa def mostrar(self): print "Contenido de la Bolsa:" print self.datos print "La bolsa es de color: %s" %(self.color)
  57. 57. POO en PYTHON def main(): # instanciamos la clase Bolsa compra = Bolsa("negra") # aplicamos el metodo agregar y como valor el numero 1 compra.agregar(1) # aplicamos el metodo agregarDosVeces y como valor el numero 2 compra.agregarDosVeces(2) # aplicamos el metodo agregar y como valor el numero 3 compra.agregar(3) #aplicamos el metodo mostrar compra.mostrar() main()
  58. 58. Usando clases Definir clases: Antes de usar un objeto, tenemos que definir su comportamiento. Esto se hace "class". Veamos otro ejemplo: class Mensaje: def __init__(self, string): self.text = string def printAll(self): print self.text print type(self) def deleteAll(self): self.text = ""
  59. 59. Explicacion En éste caso, definimos un objeto llamado "Mensaje", y dentro del "Mensaje", hay 3 funciones o "herramientas"; __init__, printAll, y deleteAll. Definir funciones en una clase es casi igual a definir funciones FUERA de una clase. La única diferencia es que el primer argumento de cualquier función tiene que ser "self".
  60. 60. Llamar clases: Una vez que definimos nuestra clase y sus funciones, hay que saber cómo utilizarla. Primero hay que darle algo de información a la clase, para que pueda trabajar: >>> mensaje1 = Mensaje("Hola Hackerss!") Nota: no necesitamos agregar el argumento "self" cuando llamamos a una función de una clase, Python lo hace por nosotros.
  61. 61. Clases La función que está trabajando ahí es __init__ . __init__ sirve la función de un "Constructor" ("init" = "initialize" = "inicializar"). Ésta función es llamada cada vez que se define un objeto. En éste caso, __init__ toma la string que se le dió a Mensaje() en forma de argumento, y se la aplica a la variable "text" de "self". "self" es el nombre universal de la instancia con la que se está trabajando. Me van siguiendo? Fijense lo que pasa cuando rompemos la llamada:
  62. 62. Clases >>> mensaje1 = Mensaje() Traceback (most recent call last): File "<stdin>", line 1, in ? TypeError: __init__() takes exactly 2 arguments (1 given) Nos faltó agregar un argumento ("Hola Hackerss!") a Mensaje(), entonces no tenemos información para aplicarle a mensage1.
  63. 63. printAll: >>> mensaje1.printAll() Hola Hackerss! <type 'instance'> Es importante ver el type: "instance" (instancia). Ese es el nombre que se le da a los objetos definidos con "class". Si se fijan en el código que le dí antes, se van a dar cuenta que el "self" que ponemos como argumento es la "instancia". Ésto nos permite tener muchas instancias de una misma clase abiertas al mismo tiempo. Podriamos hacer ésto mismo con mil variables, del meensaje1 a mensaje1000, con una string diferente cada vez.
  64. 64. deleteAll: >>> mensaje1.deleteAll() >>> mensaje1.printAll() <type 'instance'> como la función deleteAll() no tiene output, no vemos lo que hace. Pero cuando volvemos a usar printAll, la string ya no está, pero la instancia no desaparece. Eliminamos el contenido de self.text al usar deleteAll, pero la instancia persiste.
  65. 65. Extensiones: El hecho de que la instancia persista nos permite modificarla aunque ya no tenga contenidos. Por ejemplo, si agregáramos ésta función dentro de la class al principio del texto: def addText(self, string): self.text = self.text + string
  66. 66. Podríamos hacer ésto: >>> mensaje1.addText(" Como les va?") >>> mensaje1.printAll() Hola Hackerss! Como les va? <type 'instance'>
  67. 67. O ésto: >>> mensaje1.deleteAll() >>> mensaje1.addText("Oops, éste mensaje es nuevo!") >>> mensaje1.printAll() Oops, éste mensaje es nuevo! <type 'instance'>
  68. 68. Por supuesto, también podemos usar otras funciones de pythos para agregar funcionalidad, por ejemplo: >>> mensaje1 = Mensaje("Hola Hackerss!") >>> mensaje2 = Mensaje("Saludos de pen*") >>> mensajes = [mensaje1, mensaje2] >>> for mensaje in mensajes: ... mensaje.printAll() Hola Hackerss! <type 'instance'> Saludos de pen* <type 'instance'>
  69. 69. Calificacion 1 Escribe un programa en python que lea de un archivo algunos n´umeros, los ordene, los imprima a la pantalla, y que escriba los datos ordenados en otro archivo.
  70. 70. Calificacion 2 Algunos estudios utilizan la relación cintura/cadera (perímetro de la cintura y de la cadera en las mismas unidades) como indicador de obesidad. En el caso de los hombres el valor ideal es 0,8. Podemos decir que si el valor supera 0,85 uno está demasiado gordo y si no supera 0,75 está demasiado delgado. (Por supuesto se trata de una aproximación bastante burda, pues no tiene en cuenta la constitución física). Escribe un programa que te pida las medidas de la cintura y la cadera y calcule la relación cintura / cadera comentando el resultado.
  71. 71. Calificacion 3 Escribe un programa que te calcule en qué día de la semana cae un número (el día 1 sería lunes, el día 2 martes, ..., el día 7 domingo, el día 8 lunes, etc.
  72. 72. Calificacion 4 Escribe un programa que te pida un número y calcule la suma de sus cifras.

×