Então eu estava seguindo Super Considered Harmful do Python e fui testar seus exemplos.
No entanto, o Exemplo 1-3 , que deveria mostrar a maneira correta de chamar superao lidar com __init__métodos que esperam argumentos diferentes, não funciona.
Isso é o que eu recebo:
~ $ python example1-3.py
MRO: ['E', 'C', 'A', 'D', 'B', 'object']
E arg= 10
C arg= 10
A
D arg= 10
B
Traceback (most recent call last):
File "Download/example1-3.py", line 27, in <module>
E(arg=10)
File "Download/example1-3.py", line 24, in __init__
super(E, self).__init__(arg, *args, **kwargs)
File "Download/example1-3.py", line 14, in __init__
super(C, self).__init__(arg, *args, **kwargs)
File "Download/example1-3.py", line 4, in __init__
super(A, self).__init__(*args, **kwargs)
File "Download/example1-3.py", line 19, in __init__
super(D, self).__init__(arg, *args, **kwargs)
File "Download/example1-3.py", line 9, in __init__
super(B, self).__init__(*args, **kwargs)
TypeError: object.__init__() takes no parameters
Parece que por objectsi só viola uma das melhores práticas mencionadas no documento, que é os métodos que o uso superdeve aceitar *argse **kwargs.
Obviamente, o Sr. Knight esperava que seus exemplos funcionassem, então isso é algo que foi alterado nas versões recentes do Python? Verifiquei 2.6 e 2.7 e falha em ambos.
Então, qual é a maneira correta de lidar com esse problema?
object, e torna-se a chamada objecté __init__corretamente.
__init__on objectignora silenciosamente todos os parâmetros do Python 2.5. Isso mudou no Python 2.6.