Więc podążałem za Python's Super Considered Harmful i poszedłem przetestować jego przykłady.poprawny sposób korzystania z super (przekazywanie argumentów)
Jednak, Example 1-3, który ma pokazać prawidłowy sposób wywoływania super
podczas obsługi metod, które oczekują różnych argumentów, nie działa.
To co mam:
~ $ 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
Wydaje się, że sama object
narusza jeden z najlepszych praktyk wymienionych w dokumencie, który jest, że metody, które wykorzystują super
musi zaakceptować *args
i **kwargs
.
Oczywiście Pan Knight spodziewał się, że jego przykłady zadziałają, więc czy to coś zmieniło się w ostatnich wersjach Pythona? Sprawdziłem 2.6 i 2.7, i nie udało się ich obu.
Jaki jest właściwy sposób rozwiązania tego problemu?
Mój preferowany sposób to: Płaskie i proste hierarchie dziedziczenia. – millimoose
Powinieneś również przeczytać ["Python's super() za super"] (http://rhettinger.wordpress.com/2011/05/26/super-considered-super/), aby uzyskać zrównoważony widok :) –
@ BjörnPollex: Dzięki! Twój link zawiera odpowiedź na pytanie: Możesz napisać "klasę root", która dziedziczy po 'object', i upewnia się, że poprawnie wywołałeś' object'' __init__'. – cha0site