Así que seguí Super Considered Dañino de Python y fui a probar sus ejemplos.
Sin embargo, el Ejemplo 1-3 , que se supone que muestra la forma correcta de llamar supercuando se manejan __init__métodos que esperan diferentes argumentos, no funciona.
Esto es lo que obtengo:
~ $ 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 en objectsí mismo viola una de las mejores prácticas mencionadas en el documento, que es que los métodos que utilicen superdeben aceptar *argsy **kwargs.
Ahora, obviamente, el Sr. Knight esperaba que sus ejemplos funcionaran, entonces, ¿es esto algo que se cambió en las versiones recientes de Python? Revisé 2.6 y 2.7, y falla en ambos.
Entonces, ¿cuál es la forma correcta de abordar este problema?