python soporte orientado a objetos

26
Clases Herencia Constructores Polimorfismo Python: Soporte Orientado a Objetos Mario Marcelo Ber´ on ´ Area de Programaci´ on, Metodolog´ ıas y Desarrollo de Software Universidad Nacional de San Luis November 17, 2011 Universidad Nacional de San Luis Python: Soporte Orientado a Objetos

Upload: valeriaeh

Post on 09-Aug-2015

28 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Python Soporte Orientado a Objetos

ClasesHerencia

ConstructoresPolimorfismo

Python: Soporte Orientado a Objetos

Mario Marcelo BeronArea de Programacion, Metodologıas y Desarrollo de Software

Universidad Nacional de San Luis

November 17, 2011

Universidad Nacional de San Luis Python: Soporte Orientado a Objetos

Page 2: Python Soporte Orientado a Objetos

ClasesHerencia

ConstructoresPolimorfismo

Definicion de una ClaseCreacion de Instancias de una ClaseFunciones y MetodosEl Espacio de Nombres de una ClaseDefinicion de Variables y Metodos Privados

Definicion de Clases

Definicion de una Clase

class Persona:def inicializarNombre(self, nombre):self.nombre = nombredef demeNombre(self):return self.nombre

def saludar(self):print "Hola! Soy %s." % self.nombre

Universidad Nacional de San Luis Python: Soporte Orientado a Objetos

Page 3: Python Soporte Orientado a Objetos

ClasesHerencia

ConstructoresPolimorfismo

Definicion de una ClaseCreacion de Instancias de una ClaseFunciones y MetodosEl Espacio de Nombres de una ClaseDefinicion de Variables y Metodos Privados

Definicion de Clases

Definicion de una Clase

>>> p1 = Persona()>>> p2 = Persona()>>> p1.inicializarNombre(’Pedro’)>>> p2.inicializarNombre(’Juan’)>>> p1.saludar()Hola! Soy Pedro.>>> p2.saludar()Hola! Soy Juan.

Universidad Nacional de San Luis Python: Soporte Orientado a Objetos

Page 4: Python Soporte Orientado a Objetos

ClasesHerencia

ConstructoresPolimorfismo

Definicion de una ClaseCreacion de Instancias de una ClaseFunciones y MetodosEl Espacio de Nombres de una ClaseDefinicion de Variables y Metodos Privados

Funciones y Metodos

Diferencia entre un Metodo y una Funcion

>>> class Clase:def metodo(self):print ’Tengo un self!’

>>> def funcion():print "No tengo..."

Universidad Nacional de San Luis Python: Soporte Orientado a Objetos

Page 5: Python Soporte Orientado a Objetos

ClasesHerencia

ConstructoresPolimorfismo

Definicion de una ClaseCreacion de Instancias de una ClaseFunciones y MetodosEl Espacio de Nombres de una ClaseDefinicion de Variables y Metodos Privados

Atributos, Funciones y Metodos

Espacio de Nombres de una Clase

Todo el codigo escrito en una clase se ejecuta en un espacio denombres especial: El espacio de nombres de la clase.

Este espacio de nombres es accesible por todos los miembros de laclase.

Universidad Nacional de San Luis Python: Soporte Orientado a Objetos

Page 6: Python Soporte Orientado a Objetos

ClasesHerencia

ConstructoresPolimorfismo

Definicion de una ClaseCreacion de Instancias de una ClaseFunciones y MetodosEl Espacio de Nombres de una ClaseDefinicion de Variables y Metodos Privados

Atributos, Funciones y Metodos

Espacio de Nombres de una Clase

class Contador:miembros = 0

def init(self):Contador.miembros += 1

>>>m1 = Contador()>>>m1.init()Contador.miembros1>>>m2 = Contador()>>>m2.init()Contador.miembros2

Universidad Nacional de San Luis Python: Soporte Orientado a Objetos

Page 7: Python Soporte Orientado a Objetos

ClasesHerencia

ConstructoresPolimorfismo

Definicion de una ClaseCreacion de Instancias de una ClaseFunciones y MetodosEl Espacio de Nombres de una ClaseDefinicion de Variables y Metodos Privados

Definicion de Variables y Metodos Privados

Python no soporta la declaracion de variables y metodos privadosdirectametne. Esto se deja como responsabilidad del programador.

Es posible tener algo de privacidad comenzando el nombre delmetodo o atributo con dos guiones bajos.

class Reservado:

def __inaccesible(self):print "Ud. no me puede ver ..."

def accesible(self):print "El mensaje secreto es:"self.__inaccesible()

Universidad Nacional de San Luis Python: Soporte Orientado a Objetos

Page 8: Python Soporte Orientado a Objetos

ClasesHerencia

ConstructoresPolimorfismo

Definicion de una ClaseCreacion de Instancias de una ClaseFunciones y MetodosEl Espacio de Nombres de una ClaseDefinicion de Variables y Metodos Privados

Definicion de Variables y Metodos Privados

>>> s = Reservado()>>> s.__inaccesible()Traceback (most recent call last):File "<pyshell#112>", line 1, in ?s.__inaccessible()AttributeError: Reservado instance has no attribute ’__inaccesible’>>> s.accesible()El mensaje secreto es:Ud. no me puede ver ...

Universidad Nacional de San Luis Python: Soporte Orientado a Objetos

Page 9: Python Soporte Orientado a Objetos

ClasesHerencia

ConstructoresPolimorfismo

Definicion de una ClaseCreacion de Instancias de una ClaseFunciones y MetodosEl Espacio de Nombres de una ClaseDefinicion de Variables y Metodos Privados

Definicion de Variables y Metodos Privados

¿Que es lo que realmente sucede?

Dentro de la definicion de una clase, todos los nombres que comienzancon dos guiones bajos son traducidos a: Un guion bajo seguido por elnombre de la clase al inicio del identificador.

Atencion

Con la informacion antes descripta es posible acceder a lasvariables/metodos privados.

>>> s._Reservado__inaccesible()Ud. no me puede ver ...

Universidad Nacional de San Luis Python: Soporte Orientado a Objetos

Page 10: Python Soporte Orientado a Objetos

ClasesHerencia

ConstructoresPolimorfismo

Definicion de una ClaseCreacion de Instancias de una ClaseFunciones y MetodosEl Espacio de Nombres de una ClaseDefinicion de Variables y Metodos Privados

Definicion de Variables y Metodos Privados

Atencion

Algunos lenguajes soportan diferentes grados de privacidad, por ejemploJava tiene cuatro. Python no tiene esta clase de soporte de niveles deprivacidad. No obstante los dobles/simples guiones bajos dan algunaposibilidad de tener dos niveles de privacidad.

Universidad Nacional de San Luis Python: Soporte Orientado a Objetos

Page 11: Python Soporte Orientado a Objetos

ClasesHerencia

ConstructoresPolimorfismo

Super/Sub ClasesAlgunas Operaciones Utiles

Especificacion de una Superclase

class Filtro:def init(self):self.bloqueado = []

def filtro(self, secuencia):return [x for x in secuencia if x not in self.bloqueado]

class FiltroDeSPAM(Filtro):def init(self):self.bloqueado = [’SPAM’]

Universidad Nacional de San Luis Python: Soporte Orientado a Objetos

Page 12: Python Soporte Orientado a Objetos

ClasesHerencia

ConstructoresPolimorfismo

Super/Sub ClasesAlgunas Operaciones Utiles

Especificacion de una Superclase

>>> f = Filtro()>>> f.init()>>> f.filtro([1, 2, 3])[1, 2, 3]

>>> s = FiltroDeSPAM()>>> s.init()>>> s.filtro([’SPAM’, ’SPAM’, ’SPAM’, ’SPAM’, ’huevos’, ’panceta’, ’SPAM’])[’huevos’, ’panceta’]

Universidad Nacional de San Luis Python: Soporte Orientado a Objetos

Page 13: Python Soporte Orientado a Objetos

ClasesHerencia

ConstructoresPolimorfismo

Super/Sub ClasesAlgunas Operaciones Utiles

Investigando la Herencia

Para saber si una clase es una subclase de otra Ud. puede usar elmetodo: issubclass.>>> issubclass(FiltroDeSPAM, Filtro)True>>> issubclass(Filtro, FiltroDeSPAM)False

Para saber las clases bases de una clase especıfica Ud. puede hacerlo siguiente:>>> FiltroDeSPAM.__bases__

Para verificar si un objeto es una instancia de una clase Ud. puedeusar: isinstance.>>> s = FiltroDeSPAM()

>>> isinstance(s,FiltroDeSPAM )True>>> isinstance(s, Filtro)True>>> isinstance(s, str)False

Universidad Nacional de San Luis Python: Soporte Orientado a Objetos

Page 14: Python Soporte Orientado a Objetos

ClasesHerencia

ConstructoresPolimorfismo

Super/Sub ClasesAlgunas Operaciones Utiles

Herencia Multiple

class Calculadora:def calcular(self, expresion):self.valor = eval(expresion)

class Hablar:def hablar(self):print ’Hola, mi valor es’, self.valor

class CalculadoraQueHabla(Calculadora, Hablar):pass

Universidad Nacional de San Luis Python: Soporte Orientado a Objetos

Page 15: Python Soporte Orientado a Objetos

ClasesHerencia

ConstructoresPolimorfismo

Super/Sub ClasesAlgunas Operaciones Utiles

Herencia Multiple

>>> tc = CalculadoraQueHabla()>>> tc.calcular(’1+2*3’)>>> tc.hablar()Hola, mi valor es 7

Universidad Nacional de San Luis Python: Soporte Orientado a Objetos

Page 16: Python Soporte Orientado a Objetos

ClasesHerencia

ConstructoresPolimorfismo

Super/Sub ClasesAlgunas Operaciones Utiles

Herencia Multiple

Algunas Consideraciones sobre la Herencia Multiple

Si cada una de las super clases implementa un metodo de formasdiferentes, entonces se debe tener cuidado respecto del orden de lassuperclases. Los metodos de las clases que aparecen en primerlugar sobre escriben a los metodos de las restantes.

Si las super clases comparten superclases, el orden en el cual lassuperclases son visitadas mientras buscan un atributo o metodo sedenomina: Orden de Resolucion de Metodos (MRO, MethodResolution Order).

Universidad Nacional de San Luis Python: Soporte Orientado a Objetos

Page 17: Python Soporte Orientado a Objetos

ClasesHerencia

ConstructoresPolimorfismo

Constructores

class Filtro:def __init__(self):self.bloqueado = []

def filtro(self, secuencia):return [x for x in secuencia if x not in self.bloqueado]

class FiltroDeSPAM(Filtro):def __init__(self):self.bloqueado = [’SPAM’]

Universidad Nacional de San Luis Python: Soporte Orientado a Objetos

Page 18: Python Soporte Orientado a Objetos

ClasesHerencia

ConstructoresPolimorfismo

Constructores

class Pajaro:def __init__(self):self.hambre = 1

def comer(self):if self.hambre:print ’Sip...’self.hambre = 0

else:print ’No, gracias!’

>>> b = Pajaro()>>> b.comer()Sip...>>> b.comer()No, gracias!

Universidad Nacional de San Luis Python: Soporte Orientado a Objetos

Page 19: Python Soporte Orientado a Objetos

ClasesHerencia

ConstructoresPolimorfismo

Constructores

class PajaroQueCanta(Pajaro):def __init__(self):self.sonido = ’Cucare picuare cue’

def cantar(self):print self.sonido

>>> sb = PajaroQueCanta()>>> sb.cantar()Cucare picuare cue

Universidad Nacional de San Luis Python: Soporte Orientado a Objetos

Page 20: Python Soporte Orientado a Objetos

ClasesHerencia

ConstructoresPolimorfismo

Constructores

>>> sb.comer()Traceback (most recent call last):File "<stdin>", line 1, in ?File "pajaros.py", line 6, in eatif self.hungry:AttributeError: PajaroQueCanta instance has no attribute ’hambre’

Universidad Nacional de San Luis Python: Soporte Orientado a Objetos

Page 21: Python Soporte Orientado a Objetos

ClasesHerencia

ConstructoresPolimorfismo

Invocando al Constructor de la Superclase

class PajaroQueCanta(Pajaro):def __init__(self):Pajaro.__init__(self)self.sonido = ’Cucare picuare cue!’

def cantar(self):print self.sonido

Universidad Nacional de San Luis Python: Soporte Orientado a Objetos

Page 22: Python Soporte Orientado a Objetos

ClasesHerencia

ConstructoresPolimorfismo

Invocando al Constructor de la Superclase

class Pajaro(object):def __init__(self):self.hambre = 1

def comer(self):if self.hambre:print ’Sip...’self.hambre = 0else:print ’No, gracias!’

class PajaroQueCanta(Pajaro):def __init__(self):super(PajaroQueCanta, self).__init__()self.sonido = ’Cucare picuare cue!’

def cantar(self):print self.sonido

Universidad Nacional de San Luis Python: Soporte Orientado a Objetos

Page 23: Python Soporte Orientado a Objetos

ClasesHerencia

ConstructoresPolimorfismo

Polimorfismo

>>> ’abc’.count(’a’)1>>> [1, 2, ’a’].count(’a’)1

>>> from random import choice>>> x = choice([’Hola, mundo!’, [1, 2, ’e’, ’e’, 4]])>>> x.count(’e’)2

Universidad Nacional de San Luis Python: Soporte Orientado a Objetos

Page 24: Python Soporte Orientado a Objetos

ClasesHerencia

ConstructoresPolimorfismo

Polimorfismo

>>> 1+23>>> ’Hola’+’ que tal’’Hola que tal’

def add(x, y):return x+y

>>> add(1, 2)3>>> add(’Hola’, ’ que tal’)’Hola que tal’

Universidad Nacional de San Luis Python: Soporte Orientado a Objetos

Page 25: Python Soporte Orientado a Objetos

ClasesHerencia

ConstructoresPolimorfismo

Polimorfismo

>>> 1+23>>> ’Hola’+’ que tal’’Hola que tal’

def add(x, y):return x+y

>>> add(1, 2)3>>> add(’Hola’, ’ que tal’)’Hola que tal’

Universidad Nacional de San Luis Python: Soporte Orientado a Objetos

Page 26: Python Soporte Orientado a Objetos

ClasesHerencia

ConstructoresPolimorfismo

Polimorfismo

def longitudDelMensaje(x):print "La longitud de:", repr(x), "es", len(x)

>>>longitudDelMensaje(’hola’)La longitud de: ’hola’ es 4>>>longitudDelMensaje([1, 2, 3])La longitud de: [1, 2, 3] es 3

Universidad Nacional de San Luis Python: Soporte Orientado a Objetos