Итак, я следил за Python's Super Considered Harmful и отправился проверять его примеры.правильный способ использования супер (аргумент прохождение)
Однако Example 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, и он не работает на обоих.
Итак, каков правильный способ решения этой проблемы?
Мой предпочтительный способ: Плоские и простые иерархии наследования. – millimoose
Вы также должны прочитать ["Super() рассмотренный супер"] (http://rhettinger.wordpress.com/2011/05/26/super-considered-super/), чтобы получить сбалансированный вид :) –
@ BjörnPollex: Благодаря! Ваша ссылка дает ответ на вопрос: вы можете написать «корневой класс», который наследуется от 'object', и он обязательно правильно называет' object' '__init__'. – cha0site