El polimorfisme és un concepte fonamental en la programació orientada a objectes (OOP) que permet que objectes de diferents classes siguin tractats com objectes de la mateixa classe base. Això és especialment útil quan es vol escriure codi que sigui més flexible i reutilitzable.
Conceptes Clau
-
Polimorfisme en Python:
- Python suporta el polimorfisme a través de la seva naturalesa dinàmica i la seva capacitat per permetre que diferents tipus d'objectes siguin intercanviables.
- Això es pot aconseguir mitjançant l'ús de mètodes que tenen el mateix nom però que es comporten de manera diferent segons l'objecte que els crida.
-
Tipus de Polimorfisme:
- Polimorfisme de Sobrecàrrega (Overloading): No és suportat directament en Python, però es pot aconseguir amb altres tècniques.
- Polimorfisme de Sobreescriptura (Overriding): Permet que una subclasse proporcioni una implementació específica d'un mètode que ja està definit en la seva superclasse.
Exemples Pràctics
Exemple 1: Polimorfisme amb Mètodes
class Animal: def sound(self): raise NotImplementedError("Subclass must implement abstract method") class Dog(Animal): def sound(self): return "Woof" class Cat(Animal): def sound(self): return "Meow" # Funció que utilitza polimorfisme def make_sound(animal): print(animal.sound()) # Creació d'objectes dog = Dog() cat = Cat() # Crida a la funció polimòrfica make_sound(dog) # Output: Woof make_sound(cat) # Output: Meow
Exemple 2: Polimorfisme amb Operadors
class Shape: def area(self): raise NotImplementedError("Subclass must implement abstract method") class Rectangle(Shape): def __init__(self, width, height): self.width = width self.height = height def area(self): return self.width * self.height class Circle(Shape): def __init__(self, radius): self.radius = radius def area(self): return 3.14 * self.radius ** 2 # Funció que utilitza polimorfisme def print_area(shape): print(f"The area is: {shape.area()}") # Creació d'objectes rectangle = Rectangle(3, 4) circle = Circle(5) # Crida a la funció polimòrfica print_area(rectangle) # Output: The area is: 12 print_area(circle) # Output: The area is: 78.5
Exercicis Pràctics
Exercici 1: Polimorfisme amb Vehicles
Crea una jerarquia de classes per a diferents tipus de vehicles (per exemple, Car, Bike) i implementa un mètode move
que es comporti de manera diferent per a cada tipus de vehicle.
Solució
class Vehicle: def move(self): raise NotImplementedError("Subclass must implement abstract method") class Car(Vehicle): def move(self): return "The car drives on the road" class Bike(Vehicle): def move(self): return "The bike rides on the road" # Funció que utilitza polimorfisme def vehicle_move(vehicle): print(vehicle.move()) # Creació d'objectes car = Car() bike = Bike() # Crida a la funció polimòrfica vehicle_move(car) # Output: The car drives on the road vehicle_move(bike) # Output: The bike rides on the road
Exercici 2: Polimorfisme amb Instruments Musicals
Crea una jerarquia de classes per a diferents tipus d'instruments musicals (per exemple, Piano, Guitar) i implementa un mètode play
que es comporti de manera diferent per a cada tipus d'instrument.
Solució
class Instrument: def play(self): raise NotImplementedError("Subclass must implement abstract method") class Piano(Instrument): def play(self): return "The piano is playing" class Guitar(Instrument): def play(self): return "The guitar is playing" # Funció que utilitza polimorfisme def play_instrument(instrument): print(instrument.play()) # Creació d'objectes piano = Piano() guitar = Guitar() # Crida a la funció polimòrfica play_instrument(piano) # Output: The piano is playing play_instrument(guitar) # Output: The guitar is playing
Errors Comuns i Consells
-
No Implementar Mètodes Abstractes:
- Si una subclasse no implementa un mètode definit en la superclasse, es produirà un error
NotImplementedError
.
- Si una subclasse no implementa un mètode definit en la superclasse, es produirà un error
-
Confusió entre Sobrecàrrega i Sobreescriptura:
- Recorda que Python no suporta sobrecàrrega de mètodes de manera nativa. Utilitza altres tècniques com arguments per defecte o *args i **kwargs per aconseguir un comportament similar.
Conclusió
El polimorfisme és una eina poderosa en la programació orientada a objectes que permet escriure codi més flexible i reutilitzable. Mitjançant l'ús de mètodes polimòrfics, podem crear funcions que poden treballar amb objectes de diferents classes de manera uniforme. Això no només fa que el codi sigui més net i fàcil de mantenir, sinó que també permet una major extensibilitat en el futur.
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