Python es un lenguaje de programación orientado a objetos, es decir, todo en Python es un objeto. Hay un tipo especial de métodos en Python conocidos como métodos mágicos o métodos dunder (dunder aquí significa » guiones bajos dobles «). Los métodos Dunder o mágicos en Python son los métodos que tienen dos guiones bajos de prefijo y sufijo en el nombre del método. Estos se utilizan comúnmente para la sobrecarga del operador.
Algunos ejemplos de métodos mágicos son: __init__
, __add__
, __len__
, __repr__
etc.
Nota: Para saber más sobre los métodos mágicos haz clic aquí .
__Nuevo método
Cada vez que se instancia una clase
__new__
y
__init__
se llaman métodos.
__new__
se llamará al método cuando se cree un objeto y
__init__
Se llamará al método para inicializar el objeto. En la clase básica
object
, el método __new__ se define como un método estático que requiere pasar un parámetro
cls
.
cls
representa la clase que se necesita para instanciar, y el compilador proporciona automáticamente este parámetro en el momento de la instanciación.
Sintaxis:
class class_name: def __new__(cls, *args, **kwargs): statements . . return super(class_name, cls).__new__(cls, *args, **kwargs)
Nota: La instancia se puede crear dentro __new__
del método ya sea usando super
la función o llamando directamente al __new__
método sobre el objeto, donde si la clase principal es el objeto. eso es instance = super(MyClass, cls).__new__(cls, *args, **kwargs)
oinstance = object.__new__(cls, *args, **kwargs)
Si tanto el método __init__ como el método __new__ existen en la clase, entonces el método __new__ se ejecuta primero y decide si usar el método __init__ o no, porque el método __new__ puede llamar a otros constructores de clase o simplemente puede devolver otros objetos como una instancia de esta clase.
Ejemplo:
# Python program to # demonstrate __new__ # don't forget the object specified as base class A(object): def __new__(cls): print("Creating instance") return super(A, cls).__new__(cls) def __init__(self): print("Init is called") A()
Producción:
Creating instance Init is called
El ejemplo anterior muestra que el método __new__ se llama automáticamente cuando se llama el nombre de la clase, mientras que el método __init__ se llama cada vez que el método __new__ devuelve una instancia de la clase, pasando la instancia devuelta a __init__ como self
parámetro, por lo tanto, incluso si fuera a guarde la instancia en algún lugar de forma global/estática y devuélvala cada vez desde __new__, luego se llamará a __init__ cada vez que haga exactamente eso.
Esto significa que si se omite el super para el método __new__, el método __init__ no se ejecutará. Veamos si ese es el caso.
# Python program to # demonstrate __new__ class A(object): def __new__(cls): print("Creating instance") # It is not called def __init__(self): print("Init is called") print(A())
Producción:
Creating instance None
En el ejemplo anterior, se puede ver que no se llama al método __init__None
y se evalúa que la creación de instancias se debe a que el constructor no devuelve nada. Veamos qué sucede si los métodos __new__ e __init__ devuelven algo.
# Python program to # demonstrate __new__ class A(object): # new method returning a string def __new__(cls): print("Creating instance") return "GeeksforGeeks" class B(object): # init method returning a string def __init__(self): print("Initializing instance") return "GeeksforGeeks" print(A()) print(B())
Producción:
Creating instance GeeksforGeeks Initializing instance
Traceback (most recent call last): File "/home/62216eb30d3856048eff916fb8d4c32d.py", line 17, inprint(B()) TypeError: __init__() should return None, not 'str'
Este TypeError lo genera el controlador que llama al método __init__ y ni siquiera tendría sentido devolver nada del método __init__ ya que su propósito es solo alterar el estado nuevo de la instancia recién creada.
Probemos un ejemplo en el que el método __new__ devuelve una instancia de una clase diferente.
Ejemplo:
# Python program to # demonstrate __new__ method # class whose object # is returned class GeeksforGeeks(object): def __str__(self): return "GeeksforGeeks" # class returning object # of different class class Geek(object): def __new__(cls): return GeeksforGeeks() def __init__(self): print("Inside init") print(Geek())
Producción:
GeeksforGeeks
Publicación traducida automáticamente
Artículo escrito por nikhilaggarwal3 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA