Eu estava lendo 'Dive Into Python' e no capítulo sobre classes, dá este exemplo:
class FileInfo(UserDict):
"store file metadata"
def __init__(self, filename=None):
UserDict.__init__(self)
self["name"] = filename
O autor diz que, se você deseja substituir o __init__
método, deve chamar explicitamente o pai __init__
com os parâmetros corretos.
- E se essa
FileInfo
classe tivesse mais de uma classe ancestral?- Preciso chamar explicitamente todos os
__init__
métodos das classes ancestrais ?
- Preciso chamar explicitamente todos os
- Além disso, eu tenho que fazer isso com qualquer outro método que eu queira substituir?
python
overriding
superclass
liewl
fonte
fonte
Respostas:
O livro é um pouco datado em relação às chamadas de subclasse-superclasse. Também é um pouco antiquado no que diz respeito à subclasse de classes internas.
Parece que hoje em dia:
Observe o seguinte:
Podemos subclasse diretamente classes built-in, como
dict
,list
,tuple
, etc.A
super
função controla o rastreamento das superclasses dessa classe e a chamada de funções nelas adequadamente.fonte
Em cada classe da qual você precisa herdar, é possível executar um loop de cada classe que precisa ser iniciada no início da classe filho ... um exemplo que pode ser copiado pode ser melhor compreendido ...
fonte
Child.__init__
for seja necessário. Quando o removo do exemplo, a criança ainda imprime "Vovó". O init dos avós não é tratado pelaParent
classe?Você realmente não precisa chamar os
__init__
métodos da (s) classe (s) base (s), mas geralmente deseja fazê-lo, porque as classes base farão algumas inicializações importantes necessárias para o funcionamento dos métodos das demais classes.Para outros métodos, isso depende de suas intenções. Se você deseja apenas adicionar algo ao comportamento das classes base, convém chamar o método das classes base adicionalmente ao seu próprio código. Se você deseja alterar fundamentalmente o comportamento, talvez não chame o método da classe base e implemente toda a funcionalidade diretamente na classe derivada.
fonte
Se a classe FileInfo tiver mais de uma classe ancestral, você definitivamente deve chamar todas as suas funções __init __ (). Você também deve fazer o mesmo com a função __del __ (), que é um destruidor.
fonte
Sim, você deve ligar
__init__
para cada classe pai. O mesmo vale para funções, se você estiver substituindo uma função que existe nos dois pais.fonte