UNIDAD II

Lenguajes Imperativos

Profesor Miguel Cantillana

INS240 – Lenguajes de Programación
Ingeniería en Computación e Informática
Semestre 2017-1

Orientada a objetos con Python II

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

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. 

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

Sobre carga de operadores

import math

class Complejo:
    def __init__(self, real, imaginario):
        self.real = real
        self.img = imaginario

    def abs(self):
        print math.sqrt((self.real*self.real)+(self.img*self.img))


    def __add__(self, otro):
        return Complejo(self.real + otro.real, self.img + otro.img)


    def __sub__(self, otro):
        return Complejo(self.real + otro.real, self.img + otro.img)


    def mostrar(self):
        print self.real, self.img        

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.

 

Herencia

  • Definición de una clase heredada en Python.

 

class Instrumento:
    pass

class Guitarra(Instrumento):
    pass

class Bajo(Instrumento):
    pass

Herencia: El Método __init__

Cuando creamos una clase derivada a partir de una clase padre y tenemos que la clase derivada proporciona o requiere su propio método __init__ , este método de la clase derivada debe llamar explícitamente el método __init__ de la clase base.

 

Herencia:  __init__


class Animal:
    def __init__(self):
        print "Animal creado"

    def quien_soy(self):
        print "Animal"

    def comer(self):
        print "Estoy comiendo"

class Perro(Animal):
    def __init__(self):
        Animal.__init__(self)
        print "Perro creado"

    def quien_soy(self):
        print "perro"

    def ladrar(self):
        print "woof woof<!"

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)

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

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)

Ejercicio en clases 

Papel, Boligrafo, Marcador

  • Escribir una clase Papel que contenga un texto, un método escribir, que reciba una cadena para agregar al texto (concatenar), y el método __str__ que imprima el contenido del texto.
  • Escribir una clase Boligrafo que contenga una cantidad de tinta, y un método escribir, que reciba un texto y un papel sobre el cual escribir. Cada letra escrita debe reducir la cantidad de tinta contenida. Cuando la tinta se acabe, debe lanzar una excepción.
  • Escribir una clase Marcador que herede de Boligrafo, y agregue el método recargar, que reciba la cantidad de tinta a agregar.

UNAB: LP09

By Miguel Cantillana

UNAB: LP09

Clase 9

  • 403