Clases y Objetos en Python
Clases y Objetos en Python
Introducción a la Computación
Clase 23
Patricia Borensztejn
Tipos en Python
• Ya vimos que tenemos un conjunto
importante de tipos básicos y compuestos en
Python definidos por el lenguaje.
• Por ejemplo:
– los tipos básicos: enteros, reales, complejos,
booleanos (ver Clase 4)
– Las secuencias: cadenas, listas ( ver clase 11) ,
tuplas (ver clase 14)
– Otros tipos estructurados: diccionarios (clase 14) ,
sets, registros (ver clase 12)
Tipos definidos por el usuario: clases
• Vamos el crear un tipo nuevo: el tipo punto.
• Un punto está definido por sus dos
coordenadas: (x,y)
• Podemos usar uno de los tipos compuestos
existentes, como una tupla o bien una lista.
• Pero tambien podemos crear un nuevo tipo
compuesto también llamado una clase.
Sentencia class
objeto constructor
Atributos
• Podemos añadir nuevos datos a la instancia
usando el operador . (punto)
altura
ancho
class Rectangulo:
pass
caja=Rectangulo()
caja.anchura=100.0 >>>
caja.altura=200.0 1 <__main__.Rectangulo instance at 0x02A29058>
caja.esquina=Punto() 2 <__main__.Rectangulo instance at 0x02A29058>
caja.esquina.x =0.0 3 <__main__.Rectangulo instance at 0x02A23BE8>
caja.esquina.y=0.0 4 <__main__.Punto instance at 0x02A29080>
5 <__main__.Punto instance at 0x02A23E90>
1 print caja
otracaja=caja
2 print otracaja
otracaja=Rectangulo()
otracaja.esquina=Punto()
3 print otracaja
4 print caja.esquina
5 print otracaja.esquina
Copia con Módulo Copy
import copy
b1=copy.copy(caja)
1 print caja 1 <__main__.Rectangulo instance at 0x02AC9058>
2 print caja.esquina 2 <__main__.Punto instance at 0x02AC9080>
3 print b1 3 <__main__.Rectangulo instance at 0x02AC9418>
4 print b1.esquina 4 <__main__.Punto instance at 0x02AC9080>
import copy
b1=copy.deepcopy(caja)
1 print caja 1 <__main__.Rectangulo instance at 0x029FA058>
2 print caja.esquina 2 <__main__.Punto instance at 0x029FA030>
3 print b1 3 <__main__.Rectangulo instance at 0x029FA418>
4 print b1.esquina 4 <__main__.Punto instance at 0x029EE7D8>
class Hora:
def imprimeHora(self):
print str(self.horas) + ":" + str(self.minutos) + ":" + str(self.segundos)
Métodos:parámetro self
class Hora:
def imprimeHora(self):
print str(self.horas) + ":" + str(self.minutos) + ":" + str(self.segundos)
def incremento(self, segundos):
self.segundos = segundos + self.segundos
while self.segundos >= 60:
self.segundos = self.segundos - 60
self.minutos = self.minutos + 1
while self.minutos >= 60:
self.minutos = self.minutos - 60
self.horas = self.horas + 1
horaActual=Hora()
horaActual.horas=12
horaActual.minutos=5
horaActual.segundos=30
horaActual.imprimeHora()
horaActual.incremento(500)
horaActual.imprimeHora()
Una idea distinta
• La sintaxis para la llamada a una función,
imprimeHora(horaActual)
sugiere que la función es el agente activo.
Dice algo así como :
"Oye imprimeHora! Aquí hay un objeto para que lo
imprimas".
>>> p=Punto(3,4)
>>> p
<__main__.Punto instance at 0x023238A0>
>>> print p
<__main__.Punto instance at 0x023238A0>
>>> print p.x
3
>>>print p.y
4
Imprimiendo objetos
• Cuando hacemos print p, la verdad es que no
queremos imprimir la referencia al objeto,
sino su contenido.
• Esto se hace, definiendo o mejor dicho,
redefiniendo el método str dentro de la nueva
clase. Porque print llama a str.
• Recordamos que str convierte a una
representación en forma de cadena cualquier
tipo de objeto.
Redefiniendo __str__
• Si una clase ofrece un método llamado
__str__ , éste se impone al comportamiento
por defecto de la función interna str de
Python.
>>> p=Punto(3,4)
>>> print p
(3,4)
Sobrecarga de operadores
• Se hace así:
class Punto:
def __init__(self, x=0, y=0):
self.x = x
self.y = y
def __str__(self):
return '(' + str(self.x) + ', ' + str(self.y) + ')'
def __add__(self, otro):
return Punto(self.x + otro.x, self.y + otro.y)
>>> p1 = Punto(3, 4)
>>> p2 = Punto(5, 7)
>>> print p1 * p2
43
>>> print 2 * p2
(10, 14)
Usando Puntos
• Escribimos la clase en un archivo punto.py y lo
importamos.