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.

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

Practica por tu cuenta: Compilador de Python online