¿Por qué los constructores se llaman realmente "Constructores"?
Porque __init__
construye su objeto.
¿En qué se diferencian de los métodos en una clase?
Como se indica en la official documentation__init__
es llamada cuando se crea la instancia, otros métodos no reciben este tratamiento.
¿Cuál es su propósito?
El propósito es permitirle construir su objeto como lo desee en el momento de la creación.
Por ejemplo Python permite que hagas:
class Test(object):
pass
t = Test()
t.x = 10 # here you're building your object t
print t.x
Pero si quieres cada instancia de Test
tener un atributo x
igual a 10, se puede pyt ese código dentro __init__
:
class Test(object):
def __init__(self):
self.x = 10
t = Test()
print t.x
'self' es simplemente la palabra estándar utilizada como primer argumento de una función de método, eso es porque el primer argumento es la instancia de objeto (excepto class/static -metodos), en nuestro caso t
.
Ahora, si se desea que los valores personalizados para el x
atribuyen todo lo que tiene que hacer es pasar ese valor como argumento para __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 ayudará a aclarar algunas dudas, y ya que' Ya he recibido buenas respuestas a las otras preguntas Me detendré aquí :)
Técnicamente, '__init__' es un * inicializador *. El constructor python * es '__new__'. Python usa la inicialización automática en dos fases - '__new__' devuelve un objeto válido pero (por lo general) no poblado (ver' bool' para un contraejemplo), que luego tiene '__init__' invocado 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 tendrás que anular tanto '__new__' como' __init__' en una clase. –
@TimDelaney: No estoy seguro de qué quiere decir con objetos parcialmente construidos en C++. –
@phresnel En C++, el tipo de objeto es la clase base (no la subclase) mientras está en el constructor de la clase base. No puede llamar a un método virtual en el constructor de la clase base y hacer que la subclase proporcione la implementación. En Java puede llamar a un método de subclase en el constructor de la clase base, pero las variables miembro de la subclase se inicializarán automáticamente * después de * el constructor de la clase base (y la llamada al método). En los lenguajes con inicialización en dos fases como Python, puede invocar métodos en el inicializador de la clase base y hacer que la subclase proporcione (o anule) el comportamiento. –