Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Unidad 4 BaseDeDatos POO PDF
Unidad 4 BaseDeDatos POO PDF
POO
p. 2
Indice
ndice de contenido
Presentacin:.....................................................................4
Objetivos:............................................................................5
Bloques temticos:............................................................6
1. La clase object...............................................................7
2. Mtodo __init__..............................................................9
3. H....................................................................................10
3. Uso de super................................................................12
3.1. Problema en el uso de super con __init__................................................14
3.2. Problema en el uso de super con argumentos........................................16
p. 3
www.sceu.frba.utn.edu.ar/e-learning
p. 4
Bibliografa.......................................................................38
Presentacin:
xxxxxxxxxxxxxxxxxxxxxxxxxxxx
www.sceu.frba.utn.edu.ar/e-learning
p. 5
Objetivos:
Que los participantes:
xxxxxxxxxxxxxxxxxxxxxxxxxxx
www.sceu.frba.utn.edu.ar/e-learning
p. 6
Bloques temticos:
1.- La clase object
2.- Mtodo __init__
3.- Herencia mltiple
4.- Uso de super
5.- Mtodos especiales, doble guin bajo al inicio y al finalUso de __all__
6.- Variables y mtodos de instancia, de clase , estticos
7.- Base de datos Almacenaminto mediante POO.
8.- Creamos mtodos de clase 02-bd-POO.
9.- Herencia de clase 03-bd-POO.
10.- Analizar desde donde llamo a un mdulo 04-bd-POO.
11.- Separacin del cdigo en mdulos 05-bd-POO.
12.- Uso de __str__ e instancia a travs de constructor del clase padre 06-bd-POO.
13.- Persistencia de datos 07-bd-POO
www.sceu.frba.utn.edu.ar/e-learning
p. 7
1. La clase object
Cada clase definida en Python hereda de la clase "object", por lo que puede utilizar los
mtodos establecidos en dicha clase.
Supongamos la siguiente clase, en la cual lo nico que se encuentra definido es un valor
de variable c1:
00-POO/01-claseObject.py
class Auto:
color = "azul"
objeto = Auto()
print(objeto.color)
print(dir(Auto))
input()
Salida:
azul
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__',
'__eq__', '__format__', '__ge__', '__getattribute__', '__gt__',
'__hash__', '__init__', '__le__', '__lt__', '__module__',
'__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__',
'__setattr__', '__sizeof__', '__str__', '__subclasshook__',
'__weakref__', 'color']
Podemos ver dos cosas interesantes, la primera es la definicin de un objeto de la clase
Auto y la impresin del valor de color mediante el mtodo print. En este caso la
inicializacin se est realizando a travs del mtodo __init__ de la clase object.
Lo segundo es que al utilizar el mtodo dir() vemos que existen varios mtodos asociados
a Auto que no hemos definido, dichos mtodos que comienzan y terminan con un doble
guin bajo, son mtodos de la clase object, que se encuentran asociados implcitamente a
la clase Auto.
Nota: De hecho, podemos ver con el agregado del siguiente cdigo, que la clase
Auto tiene como clase padre o superclase a la clase "object", y que en si es un
objeto de la clase "type"
www.sceu.frba.utn.edu.ar/e-learning
p. 8
00-POO/02-claseObject2.py
class Auto:
color = "azul"
# Instanciamos e imprimimos el objeto de la clase Auto
objeto = Auto()
print(objeto.color)
# Imprimimos los mtodos de la clase Auto
print(dir(Auto))
# Vemos cual es su clase padre
print(Auto.__class__.__base__)
# Vemos si es un objeto de alguna clase
print(Auto.__class__)
input()
Salida:
azul
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__',
'__eq__', '__format__', '__ge__', '__getattribute__', '__gt__',
'__hash__', '__init__', '__le__', '__lt__', '__module__',
'__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__',
'__setattr__', '__sizeof__', '__str__', '__subclasshook__',
'__weakref__', 'color']
<class 'object'>
<class 'type'>
www.sceu.frba.utn.edu.ar/e-learning
p. 9
2. Mtodo __init__
Cuando trabajamos con programacin orientada a objetos POO, una de las cosas ms
importantes a tener en cuenta, es la forma en que creamos dichos objetos. Como
veremos un poco ms adelante la forma correcta de crear los objetos es mediante la
utilizacin de un mtodo (funcin) __init__ el cual es un mtodo reservado de Python que
cumple la funcin de constructor de la clase a la cual se encuentra asociada, es decir una
funcin destinada a inicializar (crear) los objetos de la clase utilizada.
La funcin __init__ puede tomar diferente tipo de argumentos, y para su correcta
utilizacin, debemos comprender como vimos, que cada clase de Python hereda en forma
implcita de la clase "object", es decir que "object" es una superclase de cada clase
definida en Python. Si no implementamos un mtodo __init__ en nuestra clase, por
defecto se ejecuta el mtodo __init__ de la clase object.
Es posible, aunque no es la forma correcta crear variables de instancia sin utilizar un
constructor como ejemplo veamos el siguiente caso en donde podemos ver que para
trabajar con variables de instancia se utiliza dentro de la clase la palabra clave "self"
00-POO/03-init1.py
class Comentario:
def imprimir( self ):
print(self.texto)
objeto = Comentario()
objeto.texto = "Hola variable de instancia"
objeto.imprimir()
input()
www.sceu.frba.utn.edu.ar/e-learning
p. 10
3. Herencia mltiple
Python soporta herencia mltiple, es decir que una clase puede heredar de ms de una
clase, para indicarlo, lo nico que tenemos que hacer es separar mediante una coma
cada una de las clases de las cuales se hereda en la definicin de la clase. As podramos
tener la clase Comentario que tiene N superclases de la siguiente forma.
class Comentario(Superclase1, Superclase2, ........., SuperclaseN):
def imprimir( self ):
print(self.texto)
Al trabajar con herencia mltiples, debemos tener mucho cuidado, para no cometer
errores, ya que si dos superclases poseen el mismo nombre de mtodo en su definicin,
de cual de las dos hereda el mtodo la clase hija?.
Estas cuestiones las iremos resolviendo con ejemplos y al estudiar el uso de super,
ahora nos ocuparemos de un problema denominado problema del diamante el cual se
da cuando una clase tiene dos superclases, las cuales tiene una superclase en comn.
Veamos el siguiente esquema, de tres niveles, en donde la Clase3 hereda de las Clase2a
y Clase2b y en donde estas dos ltimas a su vez heredan de la Clase1:
www.sceu.frba.utn.edu.ar/e-learning
p. 11
www.sceu.frba.utn.edu.ar/e-learning
p. 12
www.sceu.frba.utn.edu.ar/e-learning
p. 13
4. Uso de super
Cuando queremos invocar a un mtodo de una superclase desde una clase hija, podemos
utilizar la palabra reservada super, veamos un ejemplo:
00-POO/super.py
class Vehiculo(object):
def tipo(self):
print("Dos ruedas")
class Material(object):
def tipo(self):
print("plstico")
class Moto(Vehiculo, Material):
def modelo(self):
print("Modelo 1")
super(Moto, self).tipo()
super().tipo()
Material.tipo(self)
Vehiculo.tipo(self)
class Bicicleta(Material, Vehiculo):
def modelo(self):
print("Modelo 2")
super(Bicicleta, self).tipo()
super().tipo()
Material.tipo(self)
Vehiculo.tipo(self)
print("---------- Prioridad Clases ------------")
print(Moto.__mro__)
print(Bicicleta.__mro__)
print("---------- para objeto 1 ------------")
objeto1 = Moto()
objeto1.modelo()
objeto1.tipo()
print("---------- para objeto 2 ------------")
objeto2 = Bicicleta()
objeto2.modelo()
objeto2.tipo()
www.sceu.frba.utn.edu.ar/e-learning
p. 14
www.sceu.frba.utn.edu.ar/e-learning
p. 15
www.sceu.frba.utn.edu.ar/e-learning
p. 16
00-POO/super2_init.py
class Vehiculo(object):
def __init__(self):
print("Dos ruedas")
super(Vehiculo,self).__init__()
class Material(object):
def __init__(self):
print("plstico")
super(Material,self).__init__()
class Moto(Vehiculo, Material):
def __init__(self):
print("Modelo 1")
super().__init__()
objeto1 = Moto()
Salida:
Modelo 1
Dos ruedas
plstico
www.sceu.frba.utn.edu.ar/e-learning
p. 17
class AbueloMaterno(object):
def __init__(self):
print("AbueloMaterno")
super(AbueloMaterno, self).__init__()
www.sceu.frba.utn.edu.ar/e-learning
p. 18
class Padre(AbueloPaterno):
def __init__(self, arg):
print("Padre", "arg = ", arg)
super(Padre, self).__init__()
class Madre(AbueloMaterno):
def __init__(self, arg):
print("Madre", "arg = ", arg)
super(Madre, self).__init__()
objeto = Hijo("celeste")
Para corregir este problema, lo que podemos hacer es utilizar el * y ** para permitir que
las superclases permitan el pasaje de argumentos, an cuando ellas no los requieran.
00-POO/super4.py
class AbueloPaterno(object):
def __init__(self, *args, **kwargs):
print("AbueloPaterno")
super(AbueloPaterno, self).__init__(*args, **kwargs)
class AbueloMaterno(object):
www.sceu.frba.utn.edu.ar/e-learning
p. 19
class Padre(AbueloPaterno):
def __init__(self, arg, *args, **kwargs):
print("Padre", "arg = ", arg)
super(Padre, self).__init__(arg, *args, **kwargs)
class Madre(AbueloMaterno):
def __init__(self, arg, *args, **kwargs):
print("Madre", "arg = ", arg)
super(Madre, self).__init__(*args, **kwargs)
objeto = Hijo("celeste")
www.sceu.frba.utn.edu.ar/e-learning
p. 20
5.1. __all__
Este mtodo se utiliza para declarar aquellas variables o mtodos que no deben de ser
importados con el uso de:
from privadoall import *
y solo pueden ser importados si se especifica solo el nombre de lo que queremos
importar.
from privadoall import variablePrivada1
Nota: las variable y mtodos que no queremos importar, en realidad no son privados
(como se considerara en lenguajes como JAVA, PHP, entre otros) ya que vasta indicar su
nombre explcitamente para poder acceder a ellos.
00-POO/privado__all__.py
__all__ = ['variableACompartir1', 'funcionACompartir1']
variablePrivada1 = "Hola variable privada 1"
variableACompartir1 = "Hola variable pblica 1"
def funcionACompartir1():
return 'Hola funcin Privada 1'
print(variablePrivada1)
print(variableACompartir1)
print(funcionACompartir1())
www.sceu.frba.utn.edu.ar/e-learning
p. 21
00POO/11-recuperar__all__.py
from privadoall import *
#from privadoall import variablePrivada1
print(variableACompartir1)
print(funcionACompartir1())
# variablePrivada1 no es exportado por el mdulo ya que no esta
definido dentro de __all__
# no es accesible mediante : from privadoall import *
# pero si es accesible mediante :
print(variablePrivada1)
Al estar comentada la lnea
#from privadoall import variablePrivada1
Python nos va a decir que no existe la variablePrivada1 retornndonos un error. Sin
embargo si descomentamos la lnea, estamos explcitamente llamando a la variable, con
lo cual en este caso si podramos trabajar con dicho valor.
www.sceu.frba.utn.edu.ar/e-learning
p. 22
# Clase hija
# ###############################
class SegundaClase(PrimerClase):
def imprimir(self):
print(('Valor actual = "%s"' % self.data))
# ###############################
# Clase nieta
# ###############################
class TerceraClase(SegundaClase):
def __init__(self, valor):
self.data = valor
def __add__(self, otro):
return TerceraClase(self.data + otro)
def __str__(self):
return '[Esto se imprimer al hacer un print del objeto:
%s]' % self.data
objeto1 = TerceraClase('hola')
objeto1.imprimir()
print(objeto1)
objeto2 = objeto1 + "7"
print(objeto2)
Resultado
Valor actual = "hola"
[Esto se imprimer al hacer un print del objeto: hola]
[Esto se imprimer al hacer un print del objeto: hola7]
www.sceu.frba.utn.edu.ar/e-learning
p. 23
www.sceu.frba.utn.edu.ar/e-learning
p. 24
self.sexo = sexo
El mtodo de instancia datos() tiene como primer componente la palabra self (la que nos
permite utilizar dentro del mismo la variable de instancia self.nombre)
def datos(self, salario):
y como segundo componente un atributo (salario) que debe ser pasado por la invocacin
del mtodo a partir del objeto instanciado.
objeto.datos(100)
00-POO/14-variablesDeClase.py
class Persona(object):
empresa = "Empresa1"
def __init__( self, nombre, edad, sexo ):
self.nombre = nombre
self.edad = edad
self.sexo = sexo
print(self.nombre)
def datos(self, salario):
print("Nombre de la persona: " + self.nombre +
"\n" +
"Salario en $: " + str(salario))
objeto = Persona("Juan", 39, "masculino")
objeto.datos(100)
print(Persona.empresa)
print(objeto.empresa)
www.sceu.frba.utn.edu.ar/e-learning
p. 25
print(objeto.edad)
00-POO/15-metodosDeClase.py
class Persona(object):
@classmethod
def imprimir(cls, parametro1):
print(parametro1)
Persona.imprimir("valor del parmetro 1")
www.sceu.frba.utn.edu.ar/e-learning
p. 26
if __name__ == '__main__':
Juan = Persona('Juan Garcia', 42, 30000, 'software')
Susana = Persona('Susana Gomez', 45, 40000, 'hardware')
print(Juan.nombre, Susana.sueldo)
print(Juan.nombre.split()[-1])
Susana.sueldo *= 1.10
print(Susana.sueldo)
www.sceu.frba.utn.edu.ar/e-learning
p. 27
De esta forma es posible acceder a modificar un atributo del objeto mediante notacin de
punto simplemente como:
Susana.sueldo *= 1.10
www.sceu.frba.utn.edu.ar/e-learning
p. 28
www.sceu.frba.utn.edu.ar/e-learning
p. 29
www.sceu.frba.utn.edu.ar/e-learning
p. 30
GerenteM.py
from PersonaM import Persona
class Gerente(Persona):
def darAumento(self, porcentaje, premio=0.1):
self.sueldo *= (1.0 + porcentaje + premio)
if __name__ == '__main__':
Tom = Gerente('Tom Perez', 42, 50000, 'software')
print(Tom.nombre)
Tom.darAumento(0.10)
print(Tom.sueldo)
Notar como aqu se hace una asignacin por defecto del valor correspondiente a premio
por lo que es posible escribir la asignacin de monto de la siguientes formas dependiendo
www.sceu.frba.utn.edu.ar/e-learning
p. 31
si dejamos el monto del premio con el valor por defecto, o si lo modificamos desde fuera
respectivamente:
Tom.darAumento(0.10)
Tom.darAumento(0.10, 0.40)
www.sceu.frba.utn.edu.ar/e-learning
p. 32
www.sceu.frba.utn.edu.ar/e-learning
p. 33
www.sceu.frba.utn.edu.ar/e-learning
p. 34
Susana.darAumento(0.10)
print(Susana.sueldo)
GerenteM.py
from PersonaP.PersonaM import Persona
class Gerente(Persona):
def darAumento(self, porcentaje, premio=0.1):
self.sueldo *= (1.0 + porcentaje + premio)
crearDb.py
if __name__ == '__main__':
from PersonaP.PersonaM import Persona
from GerenteP.GerenteM import Gerente
Juan = Persona('Juan Garcia', 42)
Susana = Persona('Susana Gomez', 45, 40000)
Tom = Gerente('Tom Perez', 42, 50000, 'software')
db = [Juan, Susana, Tom]
for persona in db:
print(persona.nombre, persona.sueldo)
print('-----------------------')
for objeto in db:
objeto.darAumento(0.10)
for objeto in db:
print(objeto.nombre, '=>', objeto.sueldo)
print('-----------------------')
for objeto in db:
print(objeto.apellido(), '=>', objeto.sueldo)
print('-----------------------')
www.sceu.frba.utn.edu.ar/e-learning
p. 35
class Gerente(Persona):
def __init__(self, nombre, edad, sueldo):
Persona.__init__(self, nombre, edad, sueldo, 'Gerente')
def darAumento(self, porcentaje, premio=0.1):
Persona.darAumento(self, porcentaje + premio)
www.sceu.frba.utn.edu.ar/e-learning
p. 36
crearDb.py
if __name__ == '__main__':
# #########################################
# Para llamada a __str__
# #########################################
print('--------__str__-----------')
print(Juan)
print(Susana)
print('-----------------------')
www.sceu.frba.utn.edu.ar/e-learning
p. 37
www.sceu.frba.utn.edu.ar/e-learning
p. 38
print(db['Susana'].apellido())
db.close()
www.sceu.frba.utn.edu.ar/e-learning
p. 39
Bibliografa
Libros
Programming Python 5th Edition Mark Lutz O'Reilly 2013
Programming Python 4th Edition Mark Lutz O'Reilly 2011
Head First Python Paul Barry O'Reilly 2011
Manual online
https://docs.python.org/3.4/library/intro.html
www.sceu.frba.utn.edu.ar/e-learning