¿Cuál es la diferencia entre __init__ y __call__?

Los métodos Dunder o mágicos en Python son los métodos que tienen dos prefijos y guiones bajos de sufijo en el nombre del método. Dunder aquí significa «Doble bajo (guiones bajos)». Estos se utilizan comúnmente para la sobrecarga del operador. Algunos ejemplos de métodos mágicos son: __init__, __add__, __len__, __repr__etc. En este artículo, vamos a ver la diferencia entre dos métodos de este tipo.

Nota: Para obtener más información, consulte Dunder o métodos mágicos en Python

__en eso__()

Este método de Python es similar a un constructor en cualquier otro lenguaje de programación. Un constructor es una definición con el mismo nombre que la clase y se invoca automáticamente cuando se define el objeto de esa clase. Un constructor inicializa todas las entidades requeridas del programa para hacerlo más confiable.
Similar a esta definición, __init__() funciona como un constructor de Python, se invoca automáticamente cuando se define un objeto de la clase. Inicializa los miembros necesarios con los valores predeterminados proporcionados. También se puede invocar con los valores proporcionados durante el tiempo de declaración del objeto de la clase.

EJEMPLO:

class A:
    def __init__(self, x):
        print("inside __init__()")
        self.y = x
  
    def __str__(self):
        print("inside __str__()")
        print("value of y:", str(self.y))
  
# declaration of instance of class A
a = A(3)
  
# calling __str__() for object a
a.__str__()
  
# declaration of another instance 
# of class A
b = A(10)
  
# calling __str__() for b
b.__str__()

PRODUCCIÓN:

inside __init__()
inside __str__()
('value of y:', '3')
inside __init__()
inside __str__()
('value of y:', '10')

__llamar__()

Antes de entrar en la aplicación de __call__()necesitamos entender qué es un objeto invocable.
Un objeto invocable es aquel que puede ser llamado como una función.
En Python, __call__() se usa para resolver el código asociado con un objeto invocable. Cualquier objeto se puede convertir en un objeto invocable simplemente escribiéndolo en un formato de llamada de función. Un objeto de ese tipo invoca el método __call__() y ejecuta el código asociado a él. Esto no hace que el objeto no funcione como uno normal. El objeto se puede usar como se usa un normal.
Una cosa a tener en cuenta es que el objeto en sí mismo se usa como una función, por lo que la sintaxis debe ser correcta.

EJEMPLO:

class A:
    def __init__(self, x):
        print("inside __init__()")
        self.y = x
  
    def __str__(self):
        print("inside __str__()")
        print("value of y:", str(self.y))
  
    def __call__(self):
        res = 0
        print("inside __call__()")
        print("adding 2 to the value of y")
        res = self.y + 2
        return res
          
  
      
# declaration of instance of class A
a = A(3)
  
# calling __str__() for a
a.__str__()
  
# calling __call__() for a 
r = a()
print(r)
  
# declaration of another instance
# of class A
b = A(10)
  
# calling __str__() for b
b.__str__()
  
# calling __call__() for b
r = b()
print(r)

PRODUCCIÓN:

inside __init__()
inside __str__()
('value of y:', '3')
inside __call__()
adding 2 to the value of y
5
inside __init__()
inside __str__()
('value of y:', '10')
inside __call__()
adding 2 to the value of y
12

Diferencia entre __init__() VS __call__()

__en eso__() __llamar__()
Igual que un constructor, inicializa los valores. Se usa para una llamada directa usando el objeto
Se invoca automáticamente cuando se declara un objeto. Es invocado automáticamente por un invocable
Llamado por un objeto regular Llamado por un objeto invocable
Ejemplo:
a=A(3) #instrucción 1
a() #instrucción 2
__init__() es llamado por la instrucción 1
Ejemplo:
a=A(3) #instrucción 1
a() #instrucción 2
__call__() es llamado por la instrucción 2

Publicación traducida automáticamente

Artículo escrito por vanshikagoyal43 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *