SlideShare una empresa de Scribd logo
1 de 72
Descargar para leer sin conexión
PYTHON
  Universidad Nacional de
         Ingenieria

  Centro de Tecnologias de
       Informacion y
      Comunicaciones

   Facultad de Ciencias

   Abraham Zamudio Ch.
PYTHON


        Clase 4

Abraham Zamudio Ch.

abraham.zamudio@gmail.com
Programacion Orientada a
  Objetos en PYTHON
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.
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.
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.
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
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 = ""
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
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.
POO: El Objeto


• Ejemplo
   – Carro BMW
     • Características
        – 4 Ruedas Micheline
        – Motor BMW
        – Caja de cambios de 7 Velocidades
        – Color Azul
        – 2 Espejos
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.
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
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.
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.
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 ({}).
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__().
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
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.
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.
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.
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.
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 {}
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__.
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.
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.
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.
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.
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.
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.
POO en Python: Instanciación de
             las
           Clases
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
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.
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'
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.
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.
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.
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.
POO en Python: Atributos de datos
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
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.
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
POO en Python: Sobre Carga de
        Operadores
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.
Python: Herencia


• Definición de una clase heredada en Python.

class Instrumento:
   pass
class Guitarra(Instrumento):
   pass
class Bajo(Instrumento):
   pass
Python: Herencia Múltiple


class acuatico:
   Pass

class terrestre:
   Pass

class anfibio(acuatico, terrestre):
   pass
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)
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
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)
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.
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.
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.
Python: Encapsulación
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
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
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)
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()
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 = ""
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".
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.
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:
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.
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.
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.
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
Podríamos hacer ésto:



>>> mensaje1.addText(" Como les va?")
>>> mensaje1.printAll()
Hola Hackerss! Como les va?
<type 'instance'>
O ésto:


>>> mensaje1.deleteAll()
>>> mensaje1.addText("Oops, éste mensaje es
nuevo!")
>>> mensaje1.printAll()
Oops, éste mensaje es nuevo!
<type 'instance'>
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'>
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.
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.
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.
Calificacion 4




Escribe un programa que te pida un número y
calcule la suma de sus cifras.

Más contenido relacionado

La actualidad más candente

Clase 1 Curso Introducción a Python 2012
Clase 1 Curso Introducción a Python 2012Clase 1 Curso Introducción a Python 2012
Clase 1 Curso Introducción a Python 2012Nahuel Defossé
 
Exposición Python
Exposición PythonExposición Python
Exposición Pythondavidare
 
Clase 4/4 Curso Introducción a Python 2012
Clase 4/4 Curso Introducción a Python 2012Clase 4/4 Curso Introducción a Python 2012
Clase 4/4 Curso Introducción a Python 2012Nahuel Defossé
 
Clase 3/4 Curso Introducción a Python 2012
Clase 3/4 Curso Introducción a Python 2012Clase 3/4 Curso Introducción a Python 2012
Clase 3/4 Curso Introducción a Python 2012Nahuel Defossé
 
Clase 2/4 Curso Introducción a Python 2012
Clase 2/4 Curso Introducción a Python 2012Clase 2/4 Curso Introducción a Python 2012
Clase 2/4 Curso Introducción a Python 2012Nahuel Defossé
 
¿Porqué Python? ...y Django
¿Porqué Python? ...y Django¿Porqué Python? ...y Django
¿Porqué Python? ...y DjangoAntonio Ognio
 
Evidencia Sesión 5: Python
Evidencia Sesión 5: PythonEvidencia Sesión 5: Python
Evidencia Sesión 5: Pythonmaluacsa
 
Python para ingenieros como alternativa a matlab
Python para ingenieros como alternativa a matlabPython para ingenieros como alternativa a matlab
Python para ingenieros como alternativa a matlabSistemadeEstudiosMed
 
Evidencias de sesión 4 Curso Python
Evidencias de  sesión 4 Curso PythonEvidencias de  sesión 4 Curso Python
Evidencias de sesión 4 Curso Pythonmaluacsa
 
Tipos de datos numéricos en Python
Tipos de datos numéricos en PythonTipos de datos numéricos en Python
Tipos de datos numéricos en Pythonmaluacsa
 

La actualidad más candente (19)

Clase 1 Curso Introducción a Python 2012
Clase 1 Curso Introducción a Python 2012Clase 1 Curso Introducción a Python 2012
Clase 1 Curso Introducción a Python 2012
 
Semana 2 Fundamentos de Python(Variables)
Semana 2   Fundamentos de Python(Variables)Semana 2   Fundamentos de Python(Variables)
Semana 2 Fundamentos de Python(Variables)
 
Exposición Python
Exposición PythonExposición Python
Exposición Python
 
Introduccion a python 3
Introduccion a python 3Introduccion a python 3
Introduccion a python 3
 
Programador Jr. para Python Primera Parte
Programador Jr. para Python Primera ParteProgramador Jr. para Python Primera Parte
Programador Jr. para Python Primera Parte
 
Paralela9
Paralela9Paralela9
Paralela9
 
Clase 4/4 Curso Introducción a Python 2012
Clase 4/4 Curso Introducción a Python 2012Clase 4/4 Curso Introducción a Python 2012
Clase 4/4 Curso Introducción a Python 2012
 
Clase 3/4 Curso Introducción a Python 2012
Clase 3/4 Curso Introducción a Python 2012Clase 3/4 Curso Introducción a Python 2012
Clase 3/4 Curso Introducción a Python 2012
 
Clase 2/4 Curso Introducción a Python 2012
Clase 2/4 Curso Introducción a Python 2012Clase 2/4 Curso Introducción a Python 2012
Clase 2/4 Curso Introducción a Python 2012
 
Unidad V Tutorial de Python
Unidad V Tutorial de PythonUnidad V Tutorial de Python
Unidad V Tutorial de Python
 
¿Porqué Python? ...y Django
¿Porqué Python? ...y Django¿Porqué Python? ...y Django
¿Porqué Python? ...y Django
 
Tutorial de Python
Tutorial de PythonTutorial de Python
Tutorial de Python
 
Evidencia Sesión 5: Python
Evidencia Sesión 5: PythonEvidencia Sesión 5: Python
Evidencia Sesión 5: Python
 
Python para ingenieros como alternativa a matlab
Python para ingenieros como alternativa a matlabPython para ingenieros como alternativa a matlab
Python para ingenieros como alternativa a matlab
 
Python (ejercicios)
Python (ejercicios)Python (ejercicios)
Python (ejercicios)
 
Evidencias de sesión 4 Curso Python
Evidencias de  sesión 4 Curso PythonEvidencias de  sesión 4 Curso Python
Evidencias de sesión 4 Curso Python
 
Tipos de datos numéricos en Python
Tipos de datos numéricos en PythonTipos de datos numéricos en Python
Tipos de datos numéricos en Python
 
Paralela2
Paralela2Paralela2
Paralela2
 
Python para todos
Python para todosPython para todos
Python para todos
 

Similar a Clase4_Python-CTIC

Programacion Orientada a Objetos en python
Programacion Orientada a Objetos en pythonProgramacion Orientada a Objetos en python
Programacion Orientada a Objetos en pythonwozgeass
 
Python 3
Python 3Python 3
Python 3CHREAR
 
Intro Programación Orientada a Objetos
Intro Programación Orientada a ObjetosIntro Programación Orientada a Objetos
Intro Programación Orientada a ObjetosPablo Sepulveda P.
 
Unidad 2 ProgramacióN Orientada A Objetos (Repaso)
Unidad 2 ProgramacióN Orientada A Objetos (Repaso)Unidad 2 ProgramacióN Orientada A Objetos (Repaso)
Unidad 2 ProgramacióN Orientada A Objetos (Repaso)Sergio Sanchez
 
Curso Java Inicial 4 Poo En Java
Curso Java Inicial   4 Poo En JavaCurso Java Inicial   4 Poo En Java
Curso Java Inicial 4 Poo En JavaEmilio Aviles Avila
 
Proyecto en android completado
Proyecto en android completadoProyecto en android completado
Proyecto en android completadoKai Exo
 
Desarrollo de Aplicaciones Web II - Sesión 05 - Evolución de los lenguajes PO...
Desarrollo de Aplicaciones Web II - Sesión 05 - Evolución de los lenguajes PO...Desarrollo de Aplicaciones Web II - Sesión 05 - Evolución de los lenguajes PO...
Desarrollo de Aplicaciones Web II - Sesión 05 - Evolución de los lenguajes PO...Didier Granados
 
programacion orientada a objetos con PHP .pptx
programacion orientada a objetos con PHP .pptxprogramacion orientada a objetos con PHP .pptx
programacion orientada a objetos con PHP .pptxRICARDOEDGARDOQUINTA
 
Jyoc java-cap08 principios poo
Jyoc java-cap08 principios pooJyoc java-cap08 principios poo
Jyoc java-cap08 principios pooJyoc X
 
Programación Orientada a Objetos en Java - Parte I 2015
Programación Orientada a Objetos en Java - Parte I 2015Programación Orientada a Objetos en Java - Parte I 2015
Programación Orientada a Objetos en Java - Parte I 2015Renny Batista
 
Jyoc java-cap01 tipos de datos y entrada-salida
Jyoc java-cap01 tipos de datos y entrada-salidaJyoc java-cap01 tipos de datos y entrada-salida
Jyoc java-cap01 tipos de datos y entrada-salidaJyoc X
 

Similar a Clase4_Python-CTIC (20)

Programacion Orientada a Objetos en python
Programacion Orientada a Objetos en pythonProgramacion Orientada a Objetos en python
Programacion Orientada a Objetos en python
 
Python 3
Python 3Python 3
Python 3
 
Intro Programación Orientada a Objetos
Intro Programación Orientada a ObjetosIntro Programación Orientada a Objetos
Intro Programación Orientada a Objetos
 
Unidad 2 ProgramacióN Orientada A Objetos (Repaso)
Unidad 2 ProgramacióN Orientada A Objetos (Repaso)Unidad 2 ProgramacióN Orientada A Objetos (Repaso)
Unidad 2 ProgramacióN Orientada A Objetos (Repaso)
 
Curso Java Inicial 4 Poo En Java
Curso Java Inicial   4 Poo En JavaCurso Java Inicial   4 Poo En Java
Curso Java Inicial 4 Poo En Java
 
Guia poo php
Guia poo phpGuia poo php
Guia poo php
 
UT05-POO.pdf
UT05-POO.pdfUT05-POO.pdf
UT05-POO.pdf
 
Proyecto en android completado
Proyecto en android completadoProyecto en android completado
Proyecto en android completado
 
Desarrollo de Aplicaciones Web II - Sesión 05 - Evolución de los lenguajes PO...
Desarrollo de Aplicaciones Web II - Sesión 05 - Evolución de los lenguajes PO...Desarrollo de Aplicaciones Web II - Sesión 05 - Evolución de los lenguajes PO...
Desarrollo de Aplicaciones Web II - Sesión 05 - Evolución de los lenguajes PO...
 
programacion orientada a objetos con PHP .pptx
programacion orientada a objetos con PHP .pptxprogramacion orientada a objetos con PHP .pptx
programacion orientada a objetos con PHP .pptx
 
Unidad i poo avanzada
Unidad i   poo avanzadaUnidad i   poo avanzada
Unidad i poo avanzada
 
Jyoc java-cap08 principios poo
Jyoc java-cap08 principios pooJyoc java-cap08 principios poo
Jyoc java-cap08 principios poo
 
Programación Orientada a Objetos
Programación Orientada a ObjetosProgramación Orientada a Objetos
Programación Orientada a Objetos
 
Programación Orientada a Objetos en Java - Parte I 2015
Programación Orientada a Objetos en Java - Parte I 2015Programación Orientada a Objetos en Java - Parte I 2015
Programación Orientada a Objetos en Java - Parte I 2015
 
03 Oop
03   Oop03   Oop
03 Oop
 
Php orientado a objetos, Ronald Nina
Php orientado a objetos, Ronald NinaPhp orientado a objetos, Ronald Nina
Php orientado a objetos, Ronald Nina
 
Programación Orientada a Objetos para Python
Programación Orientada a Objetos para PythonProgramación Orientada a Objetos para Python
Programación Orientada a Objetos para Python
 
Jyoc java-cap01 tipos de datos y entrada-salida
Jyoc java-cap01 tipos de datos y entrada-salidaJyoc java-cap01 tipos de datos y entrada-salida
Jyoc java-cap01 tipos de datos y entrada-salida
 
manual de C#
manual de C#manual de C#
manual de C#
 
Manual c# 2
Manual c# 2Manual c# 2
Manual c# 2
 

Más de Abraham Zamudio (10)

Clase5_Python-CTIC
Clase5_Python-CTICClase5_Python-CTIC
Clase5_Python-CTIC
 
Clase3_Python-CTIC
Clase3_Python-CTICClase3_Python-CTIC
Clase3_Python-CTIC
 
Clase2_Python-CTIC
Clase2_Python-CTICClase2_Python-CTIC
Clase2_Python-CTIC
 
Paralela5
Paralela5Paralela5
Paralela5
 
Paralela6
Paralela6Paralela6
Paralela6
 
Paralela4
Paralela4Paralela4
Paralela4
 
Paralela3
Paralela3Paralela3
Paralela3
 
Paralela8
Paralela8Paralela8
Paralela8
 
Paralela7
Paralela7Paralela7
Paralela7
 
Paralela1
Paralela1Paralela1
Paralela1
 

Clase4_Python-CTIC

  • 1. PYTHON Universidad Nacional de Ingenieria Centro de Tecnologias de Informacion y Comunicaciones Facultad de Ciencias Abraham Zamudio Ch.
  • 2. PYTHON Clase 4 Abraham Zamudio Ch. abraham.zamudio@gmail.com
  • 3. Programacion Orientada a Objetos en PYTHON
  • 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. 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. 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. 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. 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. 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. 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. POO: El Objeto • Ejemplo – Carro BMW • Características – 4 Ruedas Micheline – Motor BMW – Caja de cambios de 7 Velocidades – Color Azul – 2 Espejos
  • 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. POO en Python: Instanciación de las Clases
  • 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. 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. 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. 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. 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. 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. 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. POO en Python: Atributos de datos
  • 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. 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. 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. POO en Python: Sobre Carga de Operadores
  • 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. Python: Herencia • Definición de una clase heredada en Python. class Instrumento: pass class Guitarra(Instrumento): pass class Bajo(Instrumento): pass
  • 46. Python: Herencia Múltiple class acuatico: Pass class terrestre: Pass class anfibio(acuatico, terrestre): pass
  • 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. 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. 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. 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. 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. 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.
  • 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. Podríamos hacer ésto: >>> mensaje1.addText(" Como les va?") >>> mensaje1.printAll() Hola Hackerss! Como les va? <type 'instance'>
  • 67. O ésto: >>> mensaje1.deleteAll() >>> mensaje1.addText("Oops, éste mensaje es nuevo!") >>> mensaje1.printAll() Oops, éste mensaje es nuevo! <type 'instance'>
  • 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. 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. 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. 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. Calificacion 4 Escribe un programa que te pida un número y calcule la suma de sus cifras.