Na resposta de Anon:
"Se você precisa fazer algo com super, __init__
além do que está sendo feito na classe atual __init__
, você deve chamá-lo você mesmo, pois isso não acontecerá automaticamente"
É incrível: ele está expondo exatamente o contrário do princípio da herança.
Não é que "algo do super __init__
(...) não aconteça automaticamente" , é que isso aconteceria automaticamente, mas isso não acontece porque a classe base ' __init__
é substituída pela definição dos clas derivados__init__
Então, por que definir uma classe derivada ' __init__
, uma vez que substitui o que se destina quando alguém recorre à herança?
É porque é necessário definir algo que NÃO é feito na classe base ' __init__
, e a única possibilidade de obter isso é colocar sua execução em uma __init__
função de classe derivada' .
Em outras palavras, é preciso algo na classe base ' __init__
além do que seria feito automaticamente na classe base' __init__
se esta última não fosse substituída.
NÃO é o contrário.
Então, o problema é que as instruções desejadas presentes na classe base ' __init__
não são mais ativadas no momento da instanciação. Para compensar essa inativação, é necessário algo especial: chamar explicitamente a classe base ' __init__
, para MANTER , NÃO ADICIONAR, a inicialização executada pela classe base' __init__
. É exatamente o que é dito no documento oficial:
Um método de substituição em uma classe derivada pode de fato querer estender, em vez de simplesmente substituir o método da classe base com o mesmo nome. Existe uma maneira simples de chamar o método da classe base diretamente: basta chamar BaseClassName.methodname (self, argumentos).
http://docs.python.org/tutorial/classes.html#inheritance
Essa é toda a história:
quando o objetivo é manter a inicialização executada pela classe base, que é pura herança, nada de especial é necessário, é preciso apenas evitar definir uma __init__
função na classe derivada
quando o objetivo é SUBSTITUIR a inicialização realizada pela classe base, __init__
deve ser definida na classe derivada
quando o objetivo é adicionar processos à inicialização executada pela classe base, uma classe derivada ' __init__
deve ser definida, compreendendo uma chamada explícita à classe base__init__
O que me surpreende no post de Anon não é apenas o fato de ele expressar o contrário da teoria da herança, mas o fato de cinco caras terem passado por isso aprovadas sem fazer barba e, além disso, não havia ninguém para reagir em dois anos. um tópico cujo assunto interessante deve ser lido com relativa frequência.
object
foi um erro de digitação. Mas agora você nem sequer tem osuper
título da sua pergunta.