Introducció
L'herència és un dels pilars fonamentals de la programació orientada a objectes (POO). Permet crear una nova classe a partir d'una classe existent, heretant els seus atributs i mètodes. Això facilita la reutilització del codi i la creació de jerarquies de classes més organitzades i mantenibles.
Conceptes Clau
- Classe Base (o Pare): La classe de la qual s'hereten atributs i mètodes.
- Classe Derivada (o Filla): La classe que hereta atributs i mètodes de la classe base.
- Herència Simple: Una classe derivada hereta d'una única classe base.
- Herència Múltiple: Una classe derivada hereta de més d'una classe base.
Sintaxi Bàsica
En Python, la sintaxi per a la creació d'una classe derivada és la següent:
class ClasseBase:
# Atributs i mètodes de la classe base
class ClasseDerivada(ClasseBase):
# Atributs i mètodes de la classe derivadaExemple Pràctic
Vegem un exemple pràctic per entendre millor com funciona l'herència en Python.
Classe Base
class Animal:
def __init__(self, nom):
self.nom = nom
def parlar(self):
raise NotImplementedError("Aquest mètode ha de ser implementat per subclasses")Classe Derivada
class Gos(Animal):
def parlar(self):
return f"{self.nom} diu: Guau!"
class Gat(Animal):
def parlar(self):
return f"{self.nom} diu: Miau!"Utilització de les Classes
gos = Gos("Rex")
gat = Gat("Whiskers")
print(gos.parlar()) # Output: Rex diu: Guau!
print(gat.parlar()) # Output: Whiskers diu: Miau!Herència Múltiple
Python també permet l'herència múltiple, és a dir, una classe pot heretar d'altres múltiples classes. Això es fa especificant múltiples classes base entre parèntesis.
Exemple d'Herència Múltiple
class A:
def funcio_a(self):
print("Funció A")
class B:
def funcio_b(self):
print("Funció B")
class C(A, B):
pass
c = C()
c.funcio_a() # Output: Funció A
c.funcio_b() # Output: Funció BExercicis Pràctics
Exercici 1: Crear una Jerarquia de Classes
- Crea una classe base anomenada
Vehicleamb els atributsmarcaimodel, i un mètodedescripcioque imprimeixi aquests atributs. - Crea una classe derivada anomenada
Cotxeque hereti deVehiclei afegeixi un atributnombre_de_portes. - Crea una instància de
Cotxei crida el mètodedescripcio.
Solució
class Vehicle:
def __init__(self, marca, model):
self.marca = marca
self.model = model
def descripcio(self):
print(f"Marca: {self.marca}, Model: {self.model}")
class Cotxe(Vehicle):
def __init__(self, marca, model, nombre_de_portes):
super().__init__(marca, model)
self.nombre_de_portes = nombre_de_portes
cotxe = Cotxe("Toyota", "Corolla", 4)
cotxe.descripcio() # Output: Marca: Toyota, Model: CorollaExercici 2: Implementar Herència Múltiple
- Crea una classe
Voladoramb un mètodevolarque imprimeixi "Estic volant!". - Crea una classe
Avioque hereti deVehicleiVolador. - Crea una instància d'
Avioi crida els mètodesdescripcioivolar.
Solució
class Volador:
def volar(self):
print("Estic volant!")
class Avio(Vehicle, Volador):
pass
avio = Avio("Boeing", "747")
avio.descripcio() # Output: Marca: Boeing, Model: 747
avio.volar() # Output: Estic volant!Errors Comuns i Consells
- No Implementar Mètodes Abstractes: Si una classe base defineix un mètode que ha de ser implementat per les subclasses, assegura't d'implementar-lo a totes les subclasses.
- Ús Incorrecte de
super(): Quan utilitzissuper(), assegura't de cridar-lo correctament per inicialitzar la classe base.
Conclusió
L'herència és una eina poderosa en la programació orientada a objectes que permet la reutilització del codi i la creació de jerarquies de classes més organitzades. Amb l'herència, pots crear noves classes que hereten atributs i mètodes d'altres classes, facilitant així la gestió i manteniment del codi.
En el proper tema, explorarem el polimorfisme, un altre concepte clau de la programació orientada a objectes que permet que diferents classes implementin mètodes amb el mateix nom però amb comportaments diferents.
Curs de Programació en Python
Mòdul 1: Introducció a Python
- Introducció a Python
- Configuració de l'Entorn de Desenvolupament
- Sintaxi de Python i Tipus de Dades Bàsics
- Variables i Constants
- Entrada i Sortida Bàsiques
Mòdul 2: Estructures de Control
Mòdul 3: Funcions i Mòduls
- Definició de Funcions
- Arguments de Funció
- Funcions Lambda
- Mòduls i Paquets
- Visió General de la Biblioteca Estàndard
Mòdul 4: Estructures de Dades
Mòdul 5: Programació Orientada a Objectes
Mòdul 6: Gestió de Fitxers
- Lectura i Escriptura de Fitxers
- Treballant amb Fitxers CSV
- Gestió de Dades JSON
- Operacions amb Fitxers i Directoris
Mòdul 7: Gestió d'Errors i Excepcions
Mòdul 8: Temes Avançats
- Decoradors
- Generadors
- Gestors de Context
- Concurrència: Fils i Processos
- Asyncio per a Programació Asíncrona
Mòdul 9: Proves i Depuració
- Introducció a les Proves
- Proves Unitàries amb unittest
- Desenvolupament Guiat per Proves
- Tècniques de Depuració
- Ús de pdb per a la Depuració
Mòdul 10: Desenvolupament Web amb Python
- Introducció al Desenvolupament Web
- Conceptes Bàsics del Framework Flask
- Construcció d'APIs REST amb Flask
- Introducció a Django
- Construcció d'Aplicacions Web amb Django
Mòdul 11: Ciència de Dades amb Python
- Introducció a la Ciència de Dades
- NumPy per al Càlcul Numèric
- Pandas per a la Manipulació de Dades
- Matplotlib per a la Visualització de Dades
- Introducció al Machine Learning amb scikit-learn
