¿Por qué los constructores se llaman "Constructores"? ¿Cuál es su propósito y en qué se diferencian de los métodos de una clase?
Además, ¿puede haber más de uno __init__
en una clase? Intenté lo siguiente, ¿alguien puede explicar el resultado?
>>> class test:
def __init__(self):
print "init 1"
def __init__(self):
print "init 2"
>>> s=test()
init 2
Finalmente, ¿es __init__
un operador overloader?
__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 (verbool
un 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.Respuestas:
No hay sobrecarga de funciones en Python, lo que significa que no puede tener varias funciones con el mismo nombre pero con diferentes argumentos.
En su ejemplo de código, no está sobrecargando
__init__()
. Lo que sucede es que la segunda definición vuelve a vincular el nombre__init__
al nuevo método, lo que hace que el primer método sea inaccesible.En cuanto a su pregunta general sobre constructores, Wikipedia es un buen punto de partida. Para cosas específicas de Python, recomiendo ampliamente los documentos de Python .
fuente
__init__
será la que termine en la clase.¿Por qué a los constructores se les llama "Constructores"?
El constructor (con nombre
__new__
) crea y devuelve una nueva instancia de la clase. Entonces, elC.__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 nuevaC
instancia.El propósito del inicializador
C.__init__
es definir la inicialización personalizada de cada instancia deC
después de su creación.Por ejemplo, Python te permite hacer:
Pero si desea que cada instancia de
Test
tenga un atributox
igual a 10, puede poner ese código dentro__init__
: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
x
atributo, todo lo que tiene que hacer es pasar ese valor como argumento a__init__
:Espero que esto te ayude a despejar algunas dudas, y como ya has recibido buenas respuestas a las otras preguntas, me detendré aquí :)
fuente
Las clases son simplemente planos para crear objetos. El constructor es un código que se ejecuta cada vez que crea un objeto. Por lo tanto, no tiene sentido tener dos constructores. Lo que pasa es que el segundo sobrescribe al primero.
Para lo que normalmente los usa es para crear variables para ese objeto como este:
Entonces, lo que podría hacer es crear un objeto de esta clase como este:
El testobject tendrá entonces un objeto llamado
some_value
que en esta muestra será 5.Pero no es necesario establecer un valor para cada objeto como lo hice en mi muestra. También puedes hacer esto:
entonces el valor de some_value será 5 y no es necesario que lo establezca cuando cree el objeto.
el >>> y ... en mi muestra no es lo que escribes. Así se vería en pyshell ...
fuente
Los constructores se llaman automáticamente cuando crea un nuevo objeto, "construyendo" así el objeto. La razón por la que puede tener más de un inicio es porque los nombres son solo referencias en Python, y se le permite cambiar lo que cada variable hace referencia cuando lo desee (por lo tanto, escritura dinámica)
en la definición de tu clase, solo mantiene la última
fuente
No existe la noción de sobrecarga de métodos en Python. Pero puede lograr un efecto similar especificando argumentos opcionales y de palabras clave
fuente