__nuevo__ en Python

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 selfpará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, in 
    print(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

Deja una respuesta

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