Els mètodes màgics en Python, també coneguts com a mètodes especials o dunder methods (per "double underscore"), són mètodes que tenen noms especials envoltats per dobles guions baixos, com __init__, __str__, __repr__, entre d'altres. Aquests mètodes permeten definir comportaments especials per a les instàncies de les classes, com la inicialització d'objectes, la representació en forma de cadena, la comparació, i molt més.
Conceptes Clau
-
Mètodes d'Inicialització i Representació
__init__(self, ...): Inicialitza una nova instància de la classe.__str__(self): Retorna una representació en forma de cadena llegible per a humans.__repr__(self): Retorna una representació en forma de cadena que hauria de ser una expressió vàlida de Python que recrea l'objecte.
-
Mètodes d'Operadors
__add__(self, other): Defineix el comportament de l'operador+.__sub__(self, other): Defineix el comportament de l'operador-.__mul__(self, other): Defineix el comportament de l'operador*.__truediv__(self, other): Defineix el comportament de l'operador/.
-
Mètodes de Comparació
__eq__(self, other): Defineix el comportament de l'operador==.__ne__(self, other): Defineix el comportament de l'operador!=.__lt__(self, other): Defineix el comportament de l'operador<.__le__(self, other): Defineix el comportament de l'operador<=.__gt__(self, other): Defineix el comportament de l'operador>.__ge__(self, other): Defineix el comportament de l'operador>=.
-
Altres Mètodes Màgics
__len__(self): Retorna la longitud de l'objecte.__getitem__(self, key): Permet accedir a elements utilitzant la notació de clau.__setitem__(self, key, value): Permet assignar valors a elements utilitzant la notació de clau.__delitem__(self, key): Permet eliminar elements utilitzant la notació de clau.
Exemples Pràctics
Exemple 1: __init__, __str__, i __repr__
class Persona:
def __init__(self, nom, edat):
self.nom = nom
self.edat = edat
def __str__(self):
return f'{self.nom}, {self.edat} anys'
def __repr__(self):
return f'Persona(nom={self.nom!r}, edat={self.edat!r})'
# Creació d'una instància
persona = Persona('Joan', 30)
# Ús de __str__
print(persona) # Sortida: Joan, 30 anys
# Ús de __repr__
print(repr(persona)) # Sortida: Persona(nom='Joan', edat=30)Exemple 2: Mètodes d'Operadors
class Vector:
def __init__(self, x, y):
self.x = x
self.y = y
def __add__(self, altre):
return Vector(self.x + altre.x, self.y + altre.y)
def __sub__(self, altre):
return Vector(self.x - altre.x, self.y - altre.y)
def __repr__(self):
return f'Vector({self.x}, {self.y})'
# Creació de vectors
v1 = Vector(2, 3)
v2 = Vector(4, 5)
# Ús de __add__
v3 = v1 + v2
print(v3) # Sortida: Vector(6, 8)
# Ús de __sub__
v4 = v1 - v2
print(v4) # Sortida: Vector(-2, -2)Exemple 3: Mètodes de Comparació
class Persona:
def __init__(self, nom, edat):
self.nom = nom
self.edat = edat
def __eq__(self, altre):
return self.edat == altre.edat
def __lt__(self, altre):
return self.edat < altre.edat
def __repr__(self):
return f'Persona(nom={self.nom!r}, edat={self.edat!r})'
# Creació de persones
p1 = Persona('Joan', 30)
p2 = Persona('Maria', 25)
p3 = Persona('Anna', 30)
# Ús de __eq__
print(p1 == p3) # Sortida: True
# Ús de __lt__
print(p2 < p1) # Sortida: TrueExercicis Pràctics
Exercici 1: Implementar __len__ i __getitem__
Implementa una classe Llibre que tingui una llista de capítols. Defineix els mètodes __len__ per retornar el nombre de capítols i __getitem__ per accedir a un capítol específic per índex.
class Llibre:
def __init__(self, titol, capitols):
self.titol = titol
self.capitols = capitols
def __len__(self):
return len(self.capitols)
def __getitem__(self, index):
return self.capitols[index]
def __repr__(self):
return f'Llibre(titol={self.titol!r}, capitols={self.capitols!r})'
# Creació d'un llibre
llibre = Llibre('Python per a Tothom', ['Introducció', 'Variables', 'Estructures de Control'])
# Ús de __len__
print(len(llibre)) # Sortida: 3
# Ús de __getitem__
print(llibre[1]) # Sortida: VariablesExercici 2: Implementar __eq__ i __lt__ per a una Classe Producte
Implementa una classe Producte que tingui atributs nom i preu. Defineix els mètodes __eq__ per comparar productes pel seu preu i __lt__ per determinar si un producte és més barat que un altre.
class Producte:
def __init__(self, nom, preu):
self.nom = nom
self.preu = preu
def __eq__(self, altre):
return self.preu == altre.preu
def __lt__(self, altre):
return self.preu < altre.preu
def __repr__(self):
return f'Producte(nom={self.nom!r}, preu={self.preu!r})'
# Creació de productes
p1 = Producte('Llibre', 20)
p2 = Producte('Llapis', 1)
p3 = Producte('Llibreta', 5)
# Ús de __eq__
print(p1 == p3) # Sortida: False
# Ús de __lt__
print(p2 < p3) # Sortida: TrueConclusió
Els mètodes màgics són una eina poderosa en Python que permeten personalitzar el comportament de les classes de manera molt flexible. Aquests mètodes permeten definir com les instàncies de les classes es comporten en diverses situacions, com la inicialització, la representació en forma de cadena, les operacions amb operadors, i molt més. La comprensió i l'ús adequat dels mètodes màgics poden fer que el teu codi sigui més intuïtiu i fàcil de mantenir.
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
