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 derivada
Exemple 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ó B
Exercicis Pràctics
Exercici 1: Crear una Jerarquia de Classes
- Crea una classe base anomenada
Vehicle
amb els atributsmarca
imodel
, i un mètodedescripcio
que imprimeixi aquests atributs. - Crea una classe derivada anomenada
Cotxe
que hereti deVehicle
i afegeixi un atributnombre_de_portes
. - Crea una instància de
Cotxe
i 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: Corolla
Exercici 2: Implementar Herència Múltiple
- Crea una classe
Volador
amb un mètodevolar
que imprimeixi "Estic volant!". - Crea una classe
Avio
que hereti deVehicle
iVolador
. - Crea una instància d'
Avio
i crida els mètodesdescripcio
ivolar
.
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