Está en la página 1de 26

Clases Herencia Constructores Polimorsmo

Python: Soporte Orientado a Objetos


Mario Marcelo Bern o
Area de Programacin, Metodolog y Desarrollo de Software o as Universidad Nacional de San Luis

November 17, 2011

Universidad Nacional de San Luis

Python: Soporte Orientado a Objetos

Clases Herencia Constructores Polimorsmo

Denicin de una Clase o Creacin de Instancias de una Clase o Funciones y Mtodos e El Espacio de Nombres de una Clase Denicin de Variables y Mtodos Privados o e

Denicin de Clases o

Denicin de una Clase o class Persona: def inicializarNombre(self, nombre): self.nombre = nombre def demeNombre(self): return self.nombre def saludar(self): print "Hola! Soy %s." % self.nombre

Universidad Nacional de San Luis

Python: Soporte Orientado a Objetos

Clases Herencia Constructores Polimorsmo

Denicin de una Clase o Creacin de Instancias de una Clase o Funciones y Mtodos e El Espacio de Nombres de una Clase Denicin de Variables y Mtodos Privados o e

Denicin de Clases o

Denicin de una Clase o >>> 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

Clases Herencia Constructores Polimorsmo

Denicin de una Clase o Creacin de Instancias de una Clase o Funciones y Mtodos e El Espacio de Nombres de una Clase Denicin de Variables y Mtodos Privados o e

Funciones y Mtodos e

Diferencia entre un Mtodo y una Funcin e o >>> class Clase: def metodo(self): print Tengo un self! >>> def funcion(): print "No tengo..."

Universidad Nacional de San Luis

Python: Soporte Orientado a Objetos

Clases Herencia Constructores Polimorsmo

Denicin de una Clase o Creacin de Instancias de una Clase o Funciones y Mtodos e El Espacio de Nombres de una Clase Denicin de Variables y Mtodos Privados o e

Atributos, Funciones y Mtodos e

Espacio de Nombres de una Clase Todo el cdigo escrito en una clase se ejecuta en un espacio de o nombres especial: El espacio de nombres de la clase. Este espacio de nombres es accesible por todos los miembros de la clase.

Universidad Nacional de San Luis

Python: Soporte Orientado a Objetos

Clases Herencia Constructores Polimorsmo

Denicin de una Clase o Creacin de Instancias de una Clase o Funciones y Mtodos e El Espacio de Nombres de una Clase Denicin de Variables y Mtodos Privados o e

Atributos, Funciones y Mtodos e


Espacio de Nombres de una Clase class Contador: miembros = 0 def init(self): Contador.miembros += 1

>>>m1 = Contador() >>>m1.init() Contador.miembros 1 >>>m2 = Contador() >>>m2.init() Contador.miembros 2


Universidad Nacional de San Luis Python: Soporte Orientado a Objetos

Clases Herencia Constructores Polimorsmo

Denicin de una Clase o Creacin de Instancias de una Clase o Funciones y Mtodos e El Espacio de Nombres de una Clase Denicin de Variables y Mtodos Privados o e

Denicin de Variables y Mtodos Privados o e


Python no soporta la declaracin de variables y mtodos privados o e directametne. Esto se deja como responsabilidad del programador. Es posible tener algo de privacidad comenzando el nombre del mtodo o atributo con dos guiones bajos. e 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

Clases Herencia Constructores Polimorsmo

Denicin de una Clase o Creacin de Instancias de una Clase o Funciones y Mtodos e El Espacio de Nombres de una Clase Denicin de Variables y Mtodos Privados o e

Denicin de Variables y Mtodos Privados o e

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

Universidad Nacional de San Luis

Python: Soporte Orientado a Objetos

Clases Herencia Constructores Polimorsmo

Denicin de una Clase o Creacin de Instancias de una Clase o Funciones y Mtodos e El Espacio de Nombres de una Clase Denicin de Variables y Mtodos Privados o e

Denicin de Variables y Mtodos Privados o e


Qu es lo que realmente sucede? e Dentro de la denicin de una clase, todos los nombres que comienzan o con dos guiones bajos son traducidos a: Un guin bajo seguido por el o nombre de la clase al inicio del identicador. Atencin o Con la informacin antes descripta es posible acceder a las o variables/mtodos privados. e >>> s._Reservado__inaccesible() Ud. no me puede ver ...

Universidad Nacional de San Luis

Python: Soporte Orientado a Objetos

Clases Herencia Constructores Polimorsmo

Denicin de una Clase o Creacin de Instancias de una Clase o Funciones y Mtodos e El Espacio de Nombres de una Clase Denicin de Variables y Mtodos Privados o e

Denicin de Variables y Mtodos Privados o e

Atencin o Algunos lenguajes soportan diferentes grados de privacidad, por ejemplo Java tiene cuatro. Python no tiene esta clase de soporte de niveles de privacidad. No obstante los dobles/simples guiones bajos dan alguna posibilidad de tener dos niveles de privacidad.

Universidad Nacional de San Luis

Python: Soporte Orientado a Objetos

Clases Herencia Constructores Polimorsmo

Super/Sub Clases Algunas Operaciones Utiles

Especicacin de una Superclase o

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

Clases Herencia Constructores Polimorsmo

Super/Sub Clases Algunas Operaciones Utiles

Especicacin de una Superclase o

>>> >>> >>> [1,

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

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

Universidad Nacional de San Luis

Python: Soporte Orientado a Objetos

Clases Herencia Constructores Polimorsmo

Super/Sub Clases Algunas Operaciones Utiles

Investigando la Herencia
Para saber si una clase es una subclase de otra Ud. puede usar el mtodo: issubclass. e >>> issubclass(FiltroDeSPAM, Filtro) True >>> issubclass(Filtro, FiltroDeSPAM) False Para saber las clases bases de una clase espec ca Ud. puede hacer lo siguiente: >>> FiltroDeSPAM.__bases__ Para vericar si un objeto es una instancia de una clase Ud. puede usar: isinstance. >>> s = FiltroDeSPAM() >>> isinstance(s,FiltroDeSPAM ) True >>> isinstance(s, Filtro)
Universidad Nacional de San Luis Python: Soporte Orientado a Objetos

Clases Herencia Constructores Polimorsmo

Super/Sub Clases Algunas Operaciones Utiles

Herencia Mltiple u

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

Clases Herencia Constructores Polimorsmo

Super/Sub Clases Algunas Operaciones Utiles

Herencia Mltiple u

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

Universidad Nacional de San Luis

Python: Soporte Orientado a Objetos

Clases Herencia Constructores Polimorsmo

Super/Sub Clases Algunas Operaciones Utiles

Herencia Mltiple u

Algunas Consideraciones sobre la Herencia Mltiple u Si cada una de las super clases implementa un mtodo de formas e diferentes, entonces se debe tener cuidado respecto del orden de las superclases. Los mtodos de las clases que aparecen en primer e lugar sobre escriben a los mtodos de las restantes. e Si las super clases comparten superclases, el orden en el cual las superclases son visitadas mientras buscan un atributo o mtodo se e denomina: Orden de Resolucin de Mtodos (MRO, Method o e Resolution Order).

Universidad Nacional de San Luis

Python: Soporte Orientado a Objetos

Clases Herencia Constructores Polimorsmo

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

Clases Herencia Constructores Polimorsmo

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

Clases Herencia Constructores Polimorsmo

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

Clases Herencia Constructores Polimorsmo

Constructores

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

Universidad Nacional de San Luis

Python: Soporte Orientado a Objetos

Clases Herencia Constructores Polimorsmo

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

Clases Herencia Constructores Polimorsmo

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 = 0 else: print No, gracias! class PajaroQueCanta(Pajaro): def __init__(self): super(PajaroQueCanta, self).__init__() self.sonido = Cucare picuare cue! def cantar(self):
Universidad Nacional de San Luis Python: Soporte Orientado a Objetos

Clases Herencia Constructores Polimorsmo

Polimorsmo

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

Clases Herencia Constructores Polimorsmo

Polimorsmo
>>> 1+2 3 >>> 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

Clases Herencia Constructores Polimorsmo

Polimorsmo
>>> 1+2 3 >>> 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

Clases Herencia Constructores Polimorsmo

Polimorsmo

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

También podría gustarte