Por que os construtores são realmente chamados de "Construtores"? Qual é seu propósito e como eles são diferentes dos métodos em uma classe?
Além disso, pode haver mais de um __init__
em uma classe? Tentei o seguinte, alguém pode explicar o resultado?
>>> class test:
def __init__(self):
print "init 1"
def __init__(self):
print "init 2"
>>> s=test()
init 2
Finalmente, é __init__
uma sobrecarga de operador?
__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 (consultebool
para 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.Respostas:
Não há sobrecarga de função no Python, o que significa que você não pode ter várias funções com o mesmo nome, mas com argumentos diferentes.
Em seu exemplo de código, você não está sobrecarregando
__init__()
. O que acontece é que a segunda definição liga novamente o nome__init__
ao novo método, tornando o primeiro método inacessível.Quanto à sua pergunta geral sobre construtores, a Wikipedia é um bom ponto de partida. Para coisas específicas do Python, eu recomendo fortemente os documentos do Python .
fonte
__init__
será o que termina na aula.Por que os construtores são realmente chamados de "Construtores"?
O construtor (nomeado
__new__
) cria e retorna uma nova instância da classe. Portanto, oC.__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 novaC
instância.O objetivo do inicializador
C.__init__
é definir a inicialização personalizada de cada instância ouC
após sua criação.Por exemplo, Python permite que você faça:
Mas se você quiser que cada instância de
Test
tenha um atributox
igual a 10, você pode colocar esse código dentro de__init__
: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
x
atributo, tudo o que você precisa fazer é passar esse valor como argumento para__init__
: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 :)
fonte
As classes são simplesmente projetos para criar objetos. O construtor é um código que é executado sempre que você cria um objeto. Portanto, não faz sentido ter dois construtores. O que acontece é que o segundo sobrescreve o primeiro.
Normalmente, você os usa para criar variáveis para esse objeto como este:
Então, o que você poderia fazer é criar um objeto desta classe como este:
O testobject terá então um objeto chamado
some_value
que neste exemplo será 5.Mas você não precisa definir um valor para cada objeto, como fiz no meu exemplo. Você também pode fazer assim:
então, o valor de algum_valor será 5 e você não precisa defini-lo ao criar o objeto.
o >>> e ... na minha amostra não é o que você escreve. É como ficaria no pyshell ...
fonte
os co-construtores são chamados automaticamente quando você cria um novo objeto, assim "construindo" o objeto. A razão pela qual você pode ter mais de um init é porque os nomes são apenas referências em python, e você tem permissão para alterar o que cada variável faz referência quando quiser (daí a tipagem dinâmica)
na definição de sua classe, ele apenas mantém o último
fonte
Não há noção de sobrecarga de método em Python. Mas você pode obter um efeito semelhante especificando argumentos opcionais e de palavra-chave
fonte