Итак, я следил за Python «Super Считается вредным» и пошел проверять его примеры.
Однако пример 1-3 , который должен показать правильный способ вызова superпри обработке __init__методов, которые ожидают разные аргументы, категорически не работает.
Вот что я получаю:
~ $ 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
Кажется, что это objectсамо по себе нарушает одну из лучших практик, упомянутых в документе, а именно методы, которые используются, superдолжны принимать *argsи **kwargs.
Очевидно, мистер Найт ожидал, что его примеры будут работать, так что изменилось ли это в последних версиях Python? Я проверил 2.6 и 2.7, и на обоих ничего не вышло.
Итак, как правильно решить эту проблему?