Quindi stavo seguendo Super Considered Harmful di Python e sono andato a testare i suoi esempi.
Tuttavia, l' Esempio 1-3 , che dovrebbe mostrare il modo corretto di chiamare superquando si gestiscono __init__metodi che si aspettano argomenti diversi, flat-out non funziona.
Questo è quello che ottengo:
~ $ 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
Sembra che esso objectstesso violi una delle migliori pratiche menzionate nel documento, ovvero i metodi che superdevono essere utilizzati *argse **kwargs.
Ora, ovviamente Mr. Knight si aspettava che i suoi esempi funzionassero, quindi è qualcosa che è stato cambiato nelle recenti versioni di Python? Ho controllato 2.6 e 2.7 e fallisce su entrambi.
Allora qual è il modo corretto per affrontare questo problema?
object, e fa in modo di chiamata object's __init__correttamente.
__init__on objectignora silenziosamente tutti i parametri su Python 2.5. Questo è cambiato in Python 2.6.