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

  1. 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.
  2. 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

  1. No Implementar Mètodes Abstractes:

    • Si una subclasse no implementa un mètode definit en la superclasse, es produirà un error NotImplementedError.
  2. 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

Mòdul 2: Estructures de Control

Mòdul 3: Funcions i Mòduls

Mòdul 4: Estructures de Dades

Mòdul 5: Programació Orientada a Objectes

Mòdul 6: Gestió de Fitxers

Mòdul 7: Gestió d'Errors i Excepcions

Mòdul 8: Temes Avançats

Mòdul 9: Proves i Depuració

Mòdul 10: Desenvolupament Web amb Python

Mòdul 11: Ciència de Dades amb Python

Mòdul 12: Projecte Final

© Copyright 2024. Tots els drets reservats