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
