私はPython's Super Considered Harmfulをフォローし、彼の例を試しに行った。super(引数の受け渡し)を使う正しい方法
__init__
異なる引数が必要なメソッドを処理するときにsuper
を呼び出す正しい方法を示すはずのExample 1-3は、フラットアウトが機能しません。
これは私が得るものです:
~ $ 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
を受け入れなければならないということである文書で言及したベストプラクティスの1に違反しているようです。
明らかにKnight氏は彼の例題がうまくいくと予想していたので、最近のバージョンのPythonではこれが変更されていますか?私は2.6と2.7をチェックし、両方で失敗します。
この問題を解決する正しい方法は何ですか?
私の好みの方法は次のとおりです。フラットおよび単純継承階層。 – millimoose
また、バランスの取れたビューを得るために、["Pythonのsuper()と思っているスーパー"](http://rhettinger.wordpress.com/2011/05/26/super-considered-super/)も読んでください:) –
@BjörnPollex:ありがとう!あなたのリンクは質問に対する答えを提供します: 'object'から継承した' 'root class ''を書くことができ、' object'''を正しく呼び出すことができます。 – cha0site