Así que estaba siguiendo Python's Super Considered Harmful, y fui a probar sus ejemplos.manera correcta de usar super (argumento que pasa)
Sin embargo, Example 1-3, que se supone que muestra la forma correcta de llamar al manejar super
__init__
métodos que esperan diferentes argumentos, de plano no funciona.
Esto es lo que me sale:
~ $ 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 object
sí viola una de las mejores prácticas mencionadas en el documento, que es que los métodos que utilizan super
deben aceptar *args
y **kwargs
.
Ahora, obviamente, el Sr. Knight esperaba que sus ejemplos funcionaran, ¿es esto algo que se modificó en las versiones recientes de Python? Revisé 2.6 y 2.7, y falla en ambos.
Entonces, ¿cuál es la forma correcta de tratar este problema?
Mi forma preferida es: jerarquías de herencia planas y simples. – millimoose
También debería leer ["Super() de Python se considera super"] (http://rhettinger.wordpress.com/2011/05/26/super-considered-super/) para obtener una vista equilibrada :) –
@ BjörnPollex: ¡Gracias! Su enlace proporciona una respuesta a la pregunta: puede escribir una "clase de raíz" que hereda de 'objeto', y se asegura de llamar correctamente a' objeto'' __init__'. – cha0site