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.
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 constr()oprint()__len__- Llamado al usar la funciónlen()
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áticamenteSin __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"
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 bancarias