É seguro chamar um método sobrescrito de __init __ ()?

10

Este é um follow-up de esta questão :

Java eficaz 2a Edição, Item 17: Projete e documente herança, ou então proíba:

  

Existem mais algumas restrições que uma classe deve obedecer para permitir a herança. Os construtores não devem invocar métodos substituíveis, direta ou indiretamente. Se você violar esta regra, resultará uma falha no programa. O construtor da superclasse é executado antes do construtor da subclasse, portanto, o método de substituição na subclasse será chamado antes da execução do construtor da subclasse. Se o método de sobreposição depender de qualquer inicialização realizada pelo construtor da subclasse, o método não se comportará como esperado.

Como vamos apenas tocar no aspecto de inicialização do construtor do Java, eu assumo que é seguro comparar o construtor do Java com o __init__() do Python nesta questão.

Acredito que, em Python , tenho a flexibilidade de decidir quando chamar (depois de inicializar os atributos de dados da minha classe atual, neste caso) __init__() do meu ancestral em comparação com Java, em que super() precisa ser o primeira instrução na invocação de um construtor, posso estar seguro em chamar métodos substituídos de __init__() ?

Se eu estiver correto em adivinhar o que foi mencionado acima, eu não seria um designer de classe ancestral ficando à mercê do meu designer de subclasse? Se o designer da subclasse chamar meu __init__() antes de inicializar seus atributos de dados, que serão usados por um de seus métodos substituídos, e eu chamar esse método, resultarei em falha do programa!

    
por Vaibhav Bajpai 28.07.2011 в 14:18
fonte

1 resposta

6
  

Posso estar seguro em chamar métodos substituídos de __init__() ?

Você é. A ligação self já aconteceu antes que __init__() seja avaliado.

  

designer de classe ancestral ficando à mercê do meu designer de subclasse?

Isso é universalmente verdadeiro e não tem nada a ver com __init__() ou qualquer outra coisa.

Desenvolvedores de subclasses podem fazer qualquer coisa . Além disso, este é o Python: eles têm sua fonte e podem modificá-la também.

  

Se o designer de subclasse chamar meu __init__() antes de inicializar seus atributos de dados, que serão usados por um de seus métodos substituídos, e eu chamar esse método, resultarei em falha do programa!

Correto. A maneira como isso acontecerá é que o designer da subclasse escolheu um nome que você já estava usando. Eles asseguraram que o programa falharia através de sua escolha de nome.

    
por S.Lott 28.07.2011 / 14:40
fonte