Requisitos:
Para realizar esta práctica tan solo necesitamos un sistema con Python instalado. En nuestro caso vamos a utilizar un equipo con Ubuntu 22.04 LTS y Pycharm como framework de trabajo.
Para instalar Pycharm desde Ubuntu tan solo necesitamos teclear la instrucción:
sudo snap install pycharm-community --classic
Crear proyecto en Pycharm:
Al arrancar Pycharm podemos crear un nuevo proyecto, el programa nos dejará escoger el nombre del proyecto y el directorio donde estarán los ficheros, además nos dejará escoger la versión de Python que utilizaremos, en este caso será la 3.10 y el entorno virtual, usaremos Venv.
Clases en Python:
Las clases en Python tienen nombres comenzados por mayúsculas, vamos a crear una clase nueva llamada Vehículo, de momento solamente tendrá dos atributos llamados nombre y movimiento.
También tendrá un método que nos muestra los atributos del objeto llamada descripcion.
class Vehiculo:
def __init__(self, nombre, movimiento):
self.nombre = nombre
self.movimiento = movimiento
def descripcion(self):
d = "Nombre de vehículo: {}, velocidad: {}."
print(d.format(self.nombre, self.movimiento))
if __name__ == '__main__':
#creamos un vehículo coche:
v1 = Vehiculo("coche", 90)
# creamos un vehículo velero:
v2 = Vehiculo("velero", 30)
#Mostramos la descripción de los vehículos:
v1.descripcion()
v2.descripcion()
En el programa anterior hemos creado dos objetos de la clase Vehiculo v1 y v2, se trata de dos instancias diferentes de la misma clase, cada una de ellas única.
Añadir métodos a una clase:
Ahora crearemos dos métodos para cambiar los valores de los atributos de la clase modificar_nombre y modificar_movimiento, lo que vendrían a ser los setters de clase.
class Vehiculo:
def __init__(self, nombre, movimiento):
self.nombre = nombre
self.movimiento = movimiento
def descripcion(self):
d = "Nombre de vehículo: {}, velocidad: {}."
print(d.format(self.nombre, self.movimiento))
def modificar_nombre(self,n):
self.nombre = n
def modificar_movimiento(self,m):
self.movimiento = m
if __name__ == '__main__':
#creamos un vehículo coche:
v1 = Vehiculo("coche", 90)
v1.descripcion()
v1.modificar_nombre("Lamborghini")
v1.modificar_movimiento(200)
v1.descripcion()
Herencia:
Cuando una clase deriva de otra hereda sus atributos y métodos, por ejemplo, crearemos la clase VehiculoAereo que es una clase hija de Vehiculo y que hereda todo de ella.
Además incorpora un atributo nuevo llamado medio que tendrá el valor "Aire” cuando se cree una instancia de la clase.
class Vehiculo:
def __init__(self, nombre, movimiento):
self.nombre = nombre
self.movimiento = movimiento
def descripcion(self):
d = "Nombre de vehículo: {}, velocidad: {}."
print(d.format(self.nombre, self.movimiento))
class VehiculoAereo(Vehiculo):
medio = "Aire"
if __name__ == '__main__':
#creamos un vehículo coche:
v1 = VehiculoAereo("Helicóptero", 60)
v1.descripcion()
Como vemos en la clase VehiculoAereo se indica, entre paréntesis, que la clase base es Vehiculo así que ha heredado sus atributos y métodos.
Herencia múltiple:
Una clase puede derivar de más de una clase heredando sus métodos y atributos.
En el ejemplo siguiente la clase VehiculoTerrestre es heredera de las clases Vehiculo y motor y por tanto tendrá 4 atributos heredados de ambas clases.
El constructor de la nueva clase llama a los constructores de las clases padre y tiene un método que nos da su descripción:
class Vehiculo:
def __init__(self, nombre, movimiento):
self.nombre = nombre
self.movimiento = movimiento
class Motor:
def __init__(self, nombre, consumo):
self.nombre_motor = nombre
self.consumo = consumo
class VehiculoTerrestre(Vehiculo,Motor):
def __init__(self, nombre, movimiento, nombre_motor, consumo):
Vehiculo.__init__(self,nombre, movimiento)
Motor.__init__(self,nombre_motor, consumo)
def descripcion(self):
d = "Nombre de vehículo: {}, velocidad: {}, utiliza el motor {} y consume {} unidades de combustible."
print(d.format(self.nombre, self.movimiento, self.nombre_motor, self.consumo))
if __name__ == '__main__':
#creamos un vehículo coche:
v1 = VehiculoTerrestre("Citroën Mehari", 60,"gasolina",6)
v1.descripcion()
Para indicar que la clase hereda de otras dos se incorpora el nombre de ellas entre paréntesis:
class VehiculoTerrestre(Vehiculo,Motor):