class Persona():
def __init__(self, nombre, edad, lugar):
self.nombre = nombre
self.edad = edad
self.lugar = lugar
def descripcion(self):
print(f"Me llamo {self.nombre}, tengo {self.edad} años y vivo en {self.lugar}.")
juan = Persona("Juan", 24, "Ávila")
juan.descripcion()
Me llamo Juan, tengo 24 años y vivo en Ávila.
super()
¶class Empleado(Persona): # la clase Empleado hereda de la clase Persona
def __init__(self, empresa, salario):
super().__init__("Jose", 27, "Málaga") # super hace referencia, en este caso, a la clase Persona
self.enpresa = empresa
self.salario = salario
ana=Persona("Ana María", 35, "Plasencia")
jose=Empleado("IBM", 35000)
jose.descripcion() # en la descripción aún no aparece información de emp. y salario
Me llamo Jose, tengo 27 años y vivo en Málaga.
Hemos pasado valores fijos al constructor y esto no puede ser ya que
ahora todos los empleados se llamarán Jose, tendrán 27 años y serán de Málaga.
Para solucionar este inconveniente añadimos la instrucción __init__ dentro del constructor y añadimos unas variables.
class Persona():
def __init__(self, nombre, edad, lugar):
self.nombre = nombre
self.edad = edad
self.lugar = lugar
def descripcion(self):
print(f"Me llamo {self.nombre}, tengo {self.edad} años y vivo en {self.lugar}.")
class Empleado(Persona):
def __init__(self, empresa, salario, nombre_empleado, edad_empleado, lugar_empleado): # añadimos variables
super().__init__(nombre_empleado, edad_empleado, lugar_empleado) # usamos las variables
self.enpresa = empresa
self.salario = salario
paco=Empleado("AXA",28500,"Francisco",25,"Elche") # ahora pasamos 5 parámetros
paco.descripcion()
isa=Empleado("IBM",45300,"Isabel",55,"Madrid") # ahora ya no son valores fijos y puedo tener varios objetos
isa.descripcion()
Me llamo Francisco, tengo 25 años y vivo en Elche. Me llamo Isabel, tengo 55 años y vivo en Madrid.
Ahora ya hemos conseguido crear varias instancias y que no todos se llamen igual. Esto ha sido posible gracias a la introducción de nuevas variables y a la instrucción super().
Aún tenemos otro problema que consiste en que al pedir a los empleados que nos den su descripción, nos informan de su nombre, edad y lugar de residencia, pero no nos dicen nada sobre su empresa y su salario.
La solución pasa nuevamente por la instrucción super(). Hemos de añadir el método descripción dentro de la clase empleado.
class Persona():
def __init__(self, nombre, edad, lugar):
self.nombre = nombre
self.edad = edad
self.lugar = lugar
def descripcion(self):
print(f"Me llamo {self.nombre}, tengo {self.edad} años y vivo en {self.lugar}.")
class Empleado(Persona):
def __init__(self, empresa, salario, nombre_empleado, edad_empleado, lugar_empleado): # añadimos variables
super().__init__(nombre_empleado, edad_empleado, lugar_empleado) # usamos las variables
self.empresa = empresa
self.salario = salario
def descripcion(self):
super().descripcion()
print(f"Trabajo en {self.empresa} y mi salario bruto es {self.salario} €.")
paco=Empleado("AXA", 28500, "Francisco", 25, "Elche") # ahora pasamos 5 parámetros
isa=Empleado("IBM", 45300, "Isabel", 55, "Madrid") # ahora ya no son valores fijos, puedo tener varias instancias
isa.descripcion() # imprime dos líneas, una es la descripción de Persona y
print("="*50) # la otra es la descripción de Empleado
paco.descripcion()
Me llamo Isabel, tengo 55 años y vivo en Madrid. Trabajo en IBM y mi salario bruto es 45300 €. ================================================== Me llamo Francisco, tengo 25 años y vivo en Elche. Trabajo en AXA y mi salario bruto es 28500 €.
class Matriz:
def __init__(self, nombre):
print(nombre, 'es una empresa del grupo Ferrovial')
class Filial(Matriz):
def __init__(self):
print('Pertenece a un grupo constuctor')
super().__init__('Tecpresa') # el método init de la superclase requiere nombre
#Matriz.__init__(self.'Tecpresa') # equivale a la línea anterior
tec = Filial()
Pertenece a un grupo constuctor Tecpresa es una empresa del grupo Ferrovial
Un objeto (intancia) de la subclase siempre será un objeto de la superclase.
Un empleado siempre es una persona.
isinstance()
¶La instrucción isinstance()
nos informará si un objeto concreto es una instancia que pertenece a cierta clase. Esto nos vendrá bien cuando el código se complique y ya no recordemos si un objeto pertenece a una clase.
La instancia paco es un objeo de tipo Empleado y vamos a preguntar si es también de tipo Persona. Vamos a confirmarlo.
isinstance(paco, Empleado) # vamos a preguntar si paco es una instancia de tipo Empleado
True
isinstance(paco, Persona) # vamos a preguntar si paco es una instancia de tipo Persona
True
luis=Persona("Luis", 32, "Cuenca") # creamos un nuevo objeto de tipo Persona, solo con tres argumentos
isinstance(luis, Persona) # luis es una Persona
True
isinstance(luis, Empleado) # vemos que luis no es Empleado ya que una Persona no siempre es Empleado
False
En el caso anterior miBici era una instancia de la clase BicicletaElectrica.
class Vehiculo():
def __init__(self, marca, modelo):
self.marca = marca
self.modelo = modelo
self.enmarcha = False
self.acelera = False
self.frena = False
def arrancar(self):
self.enmarcha = True
def acelerar(self):
self.acelera = True
def frenar(self):
self.frena = True
def estado(self):
print(f"Marca: {self.marca} \nModelo: {self.modelo} \
\nEn marcha: {self.enmarcha} \nAcelerando: {self.acelera} \nFrenando: {self.frena}")
class VElectrico(Vehiculo): # ahora esta clase hereda de Vehiculo
def __init__(self,marca,modelo): # ahora añadimos marca y modelo
super().__init__(marca,modelo) # super() va antes que autonomía
self.autonomia = 300
def cargarEnergia(self):
self.cargando = True
class BicicletaElectrica(VElectrico): # hereda de la clase VElectrico que a su vez hereda de Vehiculo
pass
suBici=BicicletaElectrica("Xiaomi", "Qicycle") # ahora si podemos dar marca y modelo a la nueva instancia
suBici.arrancar()
suBici.estado()
Marca: Xiaomi Modelo: Qicycle En marcha: True Acelerando: False Frenando: False