Veamos un caso donde dos clases (Vehiculo y Moto) comparten parte del código. Lo deseable sería no repetir código.
Las siguientes clases luego las organizaremos mejor gracias a la herencia.
class Vehiculo:
def __init__(self, marca, color):
self.color = color
self.marca = marca
@property
def acelerar(self):
print("El vehículo está acelerando")
class Moto:
def __init__(self, marca, color):
self.color = color
self.marca = marca
@property
def acelerar(self):
print("El vehículo está acelerando")
Vemos que el código anterior repite tanto el constructor como el método acelerar.
Ahora usaremos la herencia para mejorar el código.
class Vehiculo:
def __init__(self, marca, color):
self.color = color
self.marca = marca
@property
def acelerar(self):
print("El vehículo está acelerando")
class Moto(Vehiculo): # Moto hereda de Vehiculo todo, tanto los atributos como los métodos
pass
Vamos a crear una instancia de Moto para ver que ha heredado todo de la clase padre Vehiculo.
m = Moto('Yamaha', 'negra') # creamos una instancia de la clase Moto
m.acelerar # usamos el método heredado
El vehículo está acelerando
Supongamos ahora que tenemos un atributo de clase num_ruedas, que indica que el vehículo tiene 4 ruedas. Veamos que es posible modificar ese atributo.
class Vehiculo:
num_ruedas = 4 # atributo de clase
def __init__(self, marca, color):
self.color = color
self.marca = marca
@property
def acelerar(self):
print("El vehículo está acelerando")
class Moto(Vehiculo):
pass
Ahora vamos a modificar el número de ruedas del objeto moto creado. Con ello comprobamos que es posible modificar un atributo.
m = Moto('Yamaha', 'negra')
m.num_ruedas = 2
print(f"Nuestra moto tiene {m.num_ruedas} ruedas.") # comprobamos que se ha modificado el número de ruedas
print(f"Nuestra moto es {m.color}.") # podemos ver el atributo color desde fuera de la clase
Nuestra moto tiene 2 ruedas. Nuestra moto es negra.
Hagamos que el atributo color sea privado: __color y veamos que obtenemos un error si intentamos acceder desde fuera de la clase.
class Vehiculo:
num_ruedas = 4
def __init__(self, marca, color):
self.__color = color # hacemos que color sea un atributo privado
self.marca = marca
@property
def acelerar(self):
print("El vehículo está acelerando")
class Moto(Vehiculo):
pass
m = Moto('Yamaha', 'negra')
#print(m.color) # provoca un error
#print(m.__color) # provoca un error