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 SmithSin __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áticamenteSalida:
350Punto 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.
Desafío
FácilEn 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óndriver.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"
passEsta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Object Oriented Programming
1Fundamentos de la POO
Archivos externosIntroducción a la POOClases vs ObjetosEl parámetro selfMétodosAtributosMétodo constructor (__init__)Resumen - Calculadora simple4Herencia
Herencia básicaLa función super()Sobrescritura de métodosHerencia múltipleOrden de resolución de métodosResumen - Jerarquía de empleados7Métodos especiales
Introducción a los métodos mágicosSobrecarga de operadoresMétodos mágicos de contenedoresRepaso - Lista personalizada10Patrones de diseño Parte 1
Introducción a los patrones de diseñoPatrón SingletonPatrón FactoryPatrón ObserverPatrón Strategy2Decoradores
Introducción a los decoradoresDecorador propertyDecorador de métodos estáticosDecorador de métodos de clase5Polimorfismo
Sobreescritura de métodos revisitadaDuck TypingClases y métodos abstractosDiseño de interfacesResumen - Calculadora de figuras8Conceptos avanzados de POO
Composición vs. HerenciaMixinsMétodos estáticos y de claseDecoradores de claseGestores de contexto11Patrones de diseño, parte 2
Patrón CommandPatrón AdapterPatrón DecoratorPatrón Template MethodPatrón StatePatrón Composite3Propiedades de clase
Variables de instancia vs de claseDecoradores de propiedadesAtributos privadosResumen - Gestor de cuentas bancariasPractica por tu cuenta: Compilador de Python online