¿Por qué a los constructores se les llama "Constructores"?
El constructor (con nombre __new__) crea y devuelve una nueva instancia de la clase. Entonces, el C.__new__método de clase es el constructor de la clase C.
El C.__init__método de instancia se llama en una instancia específica, después de que se crea, para inicializarlo antes de pasarlo de nuevo al llamador. Entonces ese método es el inicializador para nuevas instancias de C.
¿En qué se diferencian de los métodos de una clase?
Como se indica en la documentación oficial, __init__ se llama después de que se crea la instancia . Otros métodos no reciben este tratamiento.
Cual es su proposito?
El propósito del constructor C.__new__es definir un comportamiento personalizado durante la construcción de una nueva Cinstancia.
El propósito del inicializador C.__init__es definir la inicialización personalizada de cada instancia de Cdespués de su creación.
Por ejemplo, Python te permite hacer:
class Test(object):
pass
t = Test()
t.x = 10 # here you're building your object t
print t.x
Pero si desea que cada instancia de Testtenga un atributo xigual a 10, puede poner ese código dentro __init__:
class Test(object):
def __init__(self):
self.x = 10
t = Test()
print t.x
Cada método de instancia (un método llamado en una instancia específica de una clase) recibe la instancia como su primer argumento. Ese argumento se denomina convencionalmente self.
Los métodos de clase, como el constructor __new__, reciben la clase como primer argumento.
Ahora, si desea valores personalizados para el xatributo, todo lo que tiene que hacer es pasar ese valor como argumento a __init__:
class Test(object):
def __init__(self, x):
self.x = x
t = Test(10)
print t.x
z = Test(20)
print t.x
Espero que esto te ayude a despejar algunas dudas, y como ya has recibido buenas respuestas a las otras preguntas, me detendré aquí :)
__init__es un inicializador . El constructor de Python es__new__. Python usa la inicialización automática de dos fases:__new__devuelve un objeto válido pero (generalmente) no poblado (verboolun contraejemplo), que luego lo ha__init__llamado automáticamente. Esto evita los problemas que tienen los lenguajes como C ++ con los objetos parcialmente construidos; nunca tiene uno en Python (aunque puede estar parcialmente inicializado). Casi nunca necesitará anular ambos__new__y__init__en una clase.