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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
Top Related