Por que os construtores são realmente chamados de "Construtores"?
O construtor (nomeado __new__) cria e retorna uma nova instância da classe. Portanto, o C.__new__método da classe é o construtor da classe C.
O C.__init__método de instância é chamado em uma instância específica, depois de criado, para inicializá-lo antes de ser passado de volta ao chamador. Portanto, esse método é o inicializador para novas instâncias de C.
Como eles são diferentes dos métodos de uma classe?
Conforme declarado na documentação oficial, __init__ é chamado após a criação da instância . Outros métodos não recebem este tratamento.
Qual é o seu propósito?
O objetivo do construtor C.__new__é definir o comportamento personalizado durante a construção de uma nova Cinstância.
O objetivo do inicializador C.__init__é definir a inicialização personalizada de cada instância ou Capós sua criação.
Por exemplo, Python permite que você faça:
class Test(object):
pass
t = Test()
t.x = 10 # here you're building your object t
print t.x
Mas se você quiser que cada instância de Testtenha um atributo xigual a 10, você pode colocar esse código dentro de __init__:
class Test(object):
def __init__(self):
self.x = 10
t = Test()
print t.x
Cada método de instância (um método chamado em uma instância específica de uma classe) recebe a instância como seu primeiro argumento. Esse argumento é convencionalmente nomeado self.
Os métodos de classe, como o construtor __new__, recebem a classe como seu primeiro argumento.
Agora, se você quiser valores personalizados para o xatributo, tudo o que você precisa fazer é passar esse 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 isso ajude você a tirar algumas dúvidas, e como você já recebeu boas respostas para as outras perguntas, vou parar por aqui :)
__init__é um inicializador . O construtor python é__new__. Python usa inicialização automática de duas fases -__new__retorna um objeto válido, mas (normalmente) não preenchido (consulteboolpara um contra-exemplo), que então o__init__chamou automaticamente. Isso evita os problemas que linguagens como C ++ têm com objetos parcialmente construídos - você nunca tem um em Python (embora possa ser parcialmente inicializado). Você quase nunca precisará substituir ambos__new__e__init__em uma classe.