Menu
Coddy logo textTech

Introducción a los métodos mágicos

Parte de la sección Object Oriented Programming del Journey de Python de Coddy — lección 33 de 64.

Los métodos mágicos (también llamados métodos dunder) son métodos especiales con guiones bajos dobles al principio y al final. Python los llama automáticamente en respuesta a ciertas operaciones.

Aquí hay un ejemplo de una clase con métodos mágicos:

class Book:
    def __init__(self, title, author, pages):
        self.title = title
        self.author = author
        self.pages = pages
    
    def __str__(self):
        return f"{self.title} by {self.author}"

El método __init__ se llama automáticamente cuando creas un objeto:

my_book = Book("Python Programming", "John Smith", 350)

El método __str__ se llama automáticamente cuando conviertes el objeto en una cadena:

print(my_book)        # Llama a __str__ automáticamente
print(str(my_book))   # También llama a __str__

Salida:

Python Programming by John Smith
Python Programming by John Smith

Sin __str__, la impresión mostraría la ubicación de memoria del objeto:

class SimpleBook:
    def __init__(self, title):
        self.title = title

simple = SimpleBook("Test Book")
print(simple)  # <__main__.SimpleBook object at 0x...>

Añade otro método mágico para la longitud:

class Book:
    def __init__(self, title, author, pages):
        self.title = title
        self.author = author
        self.pages = pages
    
    def __str__(self):
        return f"{self.title} by {self.author}"
    
    def __len__(self):
        return self.pages

my_book = Book("Python Programming", "John Smith", 350)
print(len(my_book))   # Llama a __len__ automáticamente

Salida:

350

Punto clave: Los métodos mágicos comienzan y terminan con guiones bajos dobles (__method__) y son llamados automáticamente por Python. Permiten que tus objetos funcionen con funciones integradas como str(), len() y operadores, haciendo que tus clases sean más Pythonic e intuitivas de usar.

challenge icon

Desafío

Fácil

En este desafío, implementarás una clase Counter con métodos mágicos.

  • counter.py - Este es el archivo que necesitas editar, el cual contiene comentarios TODO para guiar tu implementación
  • driver.py - Contiene casos de prueba extensos

Implementa la clase Counter en counter.py y los casos de prueba en driver.py siguiendo los comentarios TODO. La clase debe admitir la inicialización con valores opcionales, representación de cadena y operaciones de suma.

Hoja de referencia

Los métodos mágicos (métodos dunder) son métodos especiales con dobles guiones bajos que Python llama automáticamente en respuesta a ciertas operaciones.

Métodos mágicos comunes:

  • __init__ - Llamado al crear un objeto
  • __str__ - Llamado al convertir a cadena con str() o print()
  • __len__ - Llamado al usar la función len()
class Book:
    def __init__(self, title, author, pages):
        self.title = title
        self.author = author
        self.pages = pages
    
    def __str__(self):
        return f"{self.title} by {self.author}"
    
    def __len__(self):
        return self.pages

my_book = Book("Python Programming", "John Smith", 350)
print(my_book)        # Llama a __str__ automáticamente
print(len(my_book))   # Llama a __len__ automáticamente

Sin __str__, al imprimir se muestra la ubicación de memoria del objeto en lugar de un formato legible.

Pruébalo tú mismo

# TODO: Importar la clase Counter desde counter.py
# Usar formato: from counter import Counter

# Manejador integral de casos de prueba
test_case = input()

if test_case == "init_test":
    # TODO: Probar la inicialización con el valor por defecto
    # Crear un contador sin argumentos e imprimirlo
    # Salida esperada: "Count: 0"
    pass

elif test_case == "init_with_value":
    # TODO: Probar la inicialización con un valor específico
    # Crear un contador con valor inicial 10 e imprimirlo
    # Nota: print() llama implícitamente a __str__, pero nuestro enfoque aquí es probar __init__
    # Salida esperada: "Count: 10"
    pass


elif test_case == "addition":
    # TODO: Probar la operación de suma
    # Crear un contador con valor 3, sumarle 7 e imprimir el resultado
    # Salida esperada: "Count: 10"
    pass

elif test_case == "chained_addition":
    # TODO: Probar operaciones de suma encadenadas
    # Crear un contador con valor 1, sumar 2, luego sumar 3 al resultado e imprimir
    # Salida esperada: "Count: 6"
    pass

elif test_case == "negative_values":
    # TODO: Probar con valores negativos
    # Crear un contador con valor -5 e imprimirlo
    # Luego sumarle -3 e imprimir el resultado
    # Salidas esperadas: "Count: -5" y "Count: -8"
    pass

elif test_case == "zero_value":
    # TODO: Probar con valores cero
    # Crear un contador con valor 0, sumar 0 e imprimir
    # Salida esperada: "Count: 0"
    pass

elif test_case == "large_values":
    # TODO: Probar con valores grandes
    # Crear un contador con valor 1000000 y sumar 9000000
    # Salida esperada: "Count: 10000000"
    pass

elif test_case == "multiple_counters":
    # TODO: Probar la interacción entre múltiples contadores
    # Crear counter1 con valor 5 y counter2 con valor 10
    # Imprimir ambos contadores
    # Salidas esperadas: "Count: 5" y "Count: 10"
    pass

elif test_case == "type_validation":
    # TODO: Probar la suma de diferentes tipos
    # Intentar sumar un float (2.5) a un contador con valor 5
    # Salida esperada: "Count: 7.5"
    pass
quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Object Oriented Programming