Los métodos mágicos en Python son una colección de métodos que se asocian automáticamente con cada definición de clase en el lenguaje. Si crea sus propias clases, puede anular uno o más métodos mágicos estándar para personalizar su comportamiento. Hay muchos métodos mágicos en Python, e incluimos una tabla de ellos al final de este tutorial. Por ahora, queremos echar un vistazo a algunos de los métodos mágicos más utilizados que pueden ser útiles en la programación diaria. Los métodos mágicos se pueden usar para personalizar cómo se representan sus objetos como cadenas, controlar cómo se accede a los atributos de un objeto durante la obtención y configuración, verificar la igualdad y hacer que un objeto sea invocable como una función.


Representación de cadenas

Los dos primeros métodos mágicos que vamos a aprender son los que usa Python para generar representaciones de cadenas de objetos. Uno se llama __str__ y el otro se llama __repr__ . La función __str__ se utiliza para generar una descripción de cadena fácil de usar del objeto y, por lo general, está destinada a mostrarse al usuario. La función __repr__ se usa más para el desarrollador del software. Genera una cadena que se puede usar con fines de depuración, por lo que se usa para mostrar mucha información detallada. Estas funciones se invocan en un objeto de diversas formas. Cuando llama a la función print () y pasa el objeto, o cuando usa __str__ o__repr__ funciones de conversión, estos métodos serán llamados.

__str__ y __repr__

Curso intensivo de Python por Eric Matthes, cuesta 23,99
Serious Python de Julien Danjou, cuesta 25,43

Curso intensivo de Python por Eric Matthes, cuesta 23,99
title = Serious Python, autor = Julien Danjou, precio = 25.43

Igualdad y comparación

Al usar los métodos mágicos de igualdad y comparación, podemos dar a los objetos la capacidad de compararse entre sí. El método mágico llamado eq, se llama a su objeto cuando se compara con otro objeto. El siguiente código también implementa el método mágico mayor o igual que y el método menos mágico.

__eq__ __ge__ __lt__

Falso
Falso
Cierto

Cierto
Falso
Cierto

['Python para niños', 'Curso intensivo de Python', 'Python serio', 'Automatiza las cosas aburridas con Python']

Acceso a atributos

Los métodos mágicos de Python también le brindan un control completo sobre cómo se accede a los atributos de un objeto. Una clase puede definir métodos que intercepten el proceso cada vez que se establece o recupera un atributo. Los métodos que veremos en la sección son los siguientes.

  • __getattribute__ Se llama cuando se recupera un atributo. Tenga en cuenta que no puede acceder directamente al nombre del atributo, de lo contrario se crea un bucle recursivo
  • Se llama a __setattr__ cuando se establece un valor de atributo. No establezca el atributo directamente aquí, de lo contrario, un bucle recursivo provocará un bloqueo
  • Se llama a __getattr__ cuando falla la búsqueda de __getattribute__; puede generar atributos sobre la marcha con este método

__getattribute__ __setattr__ __getattr__

Curso intensivo de Python por Eric Matthes, cuesta 34.155
Serious Python de Julien Danjou, cuesta 36,0
¡randomprop no está aquí!

Hacer un objeto invocable

El método mágico __call__ tiene la interesante habilidad de hacer que un objeto sea invocable tal como llamarías a cualquier otra función en Python.

Curso intensivo de Python por Eric Matthes, cuesta 23,99
Aprender Python por Mark Lutz, cuesta 44,94

Referencia de métodos de Python Magic

Inicialización y construcciónQue hace
__nuevo __ ( cls, otro )Nos permite anular el paso nuevo de cualquier objeto mediante el método mágico __new__
__init __ ( yo, otro )Cuando se crea un objeto, se inicializa llamando al método __init__ en el objeto
__del __ ( yo )__del__ es un método destructor que se llama tan pronto como se eliminan todas las referencias del objeto, es decir, cuando un objeto se recolecta como basura
Operadores y funciones unariosQue hace
__pos __ ( yo )Implementa comportamiento para unario positivo (por ejemplo, + algún_objeto )
__neg __ ( yo mismo )Implementa el comportamiento para cuando el unario - operador se llama en nuestro objetivo
__abs __ ( yo )Es llamado por la función incorporada abs () . Elimina el signo negativo de un número (si es negativo)
__invertir __ ( uno mismo )Utiliza el operador ~ . Es la operación de "inversión" o "complemento", en la que todos los bits de los datos de entrada se invierten
__redondo __ ( uno mismo, n )Implementa el comportamiento de la función round () . Devuelve un número de punto flotante que es una versión redondeada del número especificado.
__floor __ ( self )Implementa la incorporada en Math.floor () de función
__ceil __ ( auto )ceil () devuelve el valor máximo de x, es decir, el número entero más pequeño no menor que x
__trunc __ ( propio )Elimina los valores decimales que es lo math.trunc () hace
Asignación aumentadaQue hace
__iadd __ ( yo, otro )suma con asignación: a + = b
__isub __ ( yo, otro )resta con asignación: a - = b
__imul __ ( yo, otro )multiplicación con asignación: a * = b
__ifloordiv __ ( yo, otro )división entera con asignación: a // = b
__idiv __ ( yo, otro )división con asignación: a / = b
__itruediv __ ( yo, otro )verdadera división con asignación
__imod __ ( yo, otro )módulo con asignación: a% = b
__ipow __ ( yo, otro )exponentes con asignación: a ** = b
__ilshift __ ( yo, otro )desplazamiento bit a la izquierda con asignación: a << = b
__irshift __ ( uno mismo, otro )desplazamiento a la derecha bit a bit con asignación: a >> = b
__iand __ ( yo, otro )AND bit a bit con asignación: a & = b
__ior __ ( yo, otro )OR bit a bit con asignación: a | = b
__ixor __ ( yo, otro )XOR bit a bit con asignación: a ^ = b
Conversión de tipoQue hace
__int __ ( yo )int () método para convertir un tipo en un int
__float __ ( auto )método float () para convertir un tipo en flotante
__complejo __ ( propio )método complex () para convertir un tipo en complejo
__oct __ ( yo )método oct () para convertir un tipo a octal
__hex __ ( propio )método hex () para convertir un tipo a hexadecimal
__index __ ( propio )Implementa la conversión de tipo a un int cuando el objeto se usa en una expresión de sector
__trunc __ ( propio )Recibir una llamada de matemáticas. método trunc ()
Métodos de magia de cuerdasQue hace
__str __ ( yo )método str () para devolver una representación de cadena de un tipo
__repr __ ( yo )método repr () para devolver una representación legible por máquina de un tipo
__unicode __ ( propio )método unicode () para devolver una cadena Unicode de un tipo
__format __ ( self, formattr )método string.format () para devolver un nuevo estilo de cadena
__hash __ ( yo )método hash () para devolver un entero
__nonzero __ ( yo )método bool () para devolver verdadero o falso
__dir __ ( yo )método dir () para devolver una lista de atributos de una clase
__tamaño de __ ( propio )Método sys.getsizeof () para devolver el tamaño de un objeto
Métodos mágicos de atributosQue hace
__getattr __ ( yo, nombre )se llama cuando el atributo de acceso de una clase que no existe
__setattr __ ( yo, nombre, valor )llamado al asignar un valor al atributo de una clase
__delattr __ ( yo, nombre )llamado al eliminar un atributo de una clase
Métodos mágicos del operadorQue hace
__add __ ( yo, otro )agregar operación usando + operador
__sub __ ( yo, otro )operación de resta usando - operador
__mul __ ( yo, otro )operación de multiplicación usando el operador *
__floordiv __ ( yo, otro )operación de división de piso usando // operador
__div __ ( yo, otro )operación de división usando / operator
__mod __ ( yo, otro )operación de módulo usando el operador %
__pow __ ( yo, otro [, módulo] )calculando la potencia usando ** operador
__lt __ ( yo, otro )comparación usando < operador
__le __ ( yo, otro )comparación usando <= operador
__eq __ ( yo, otro )comparación usando == operador
__ne __ ( yo, otro )comparación usando ! = operador
__ge __ ( yo, otro )comparación usando > = operador