1

なぜ引数object.__init__を取らないのですか?*args, **kwargsこれは、私が見る限り、いくつかの単純なコードを非常に厄介な方法で壊し、利点はありません。

__init__すべての親クラスのすべてが呼び出されることを確認したいとします。すべてのinitがsuper().__init__これを呼び出すという単純な規則に従っている限り、階層全体が実行され、それが1回だけ実行されることが保証されます(親を具体的に指定する必要もありません)。問題は、引数を渡すときに発生します。

class Foo:
    def __init__(self, *args, **kwargs):
        print("foo-init")
        super().__init__(*args, **kwargs) # error if there are arguments!

class Bar:
    def __init__(self, *args, **kwargs):
        print("bar-init")
        super().__init__(*args, **kwargs)

class Baz(Bar, Foo):
    def __init__(self, *args, **kwargs):
        print("baz-init")
        super().__init__(*args, **kwargs)

b1 = Baz() # works
b2 = Baz("error")

これの理由は何ですか?また、最も一般的な(!私の特定のケースでは簡単に解決できますが、階層の追加知識に依存します)回避策は何ですか?私が見ることができる最善の方法は、親がオブジェクトであるかどうかを確認することです。その場合、引数を与えないでください。ひどく醜いです。

4

2 に答える 2

4

ディスカッションについては、 http://bugs.python.org/issue1683368を参照してください。そこにいる誰かが実際にエラーを引き起こすように要求したことに注意してください。python-devの説明も参照してください。

とにかく、あなたのデザインはかなり奇妙です。なぜあなたはすべてのクラスを不特定のものにするように書いているの*argsです**kwargsか?一般に、メソッドに必要な引数を受け入れさせる方がよいでしょう。たとえば、誰かがキーワード名を間違って入力した場合、すべてに対して自由記述式の引数を受け入れると、あらゆる種類のバグが発生する可能性があります。必要な場合もありますが、デフォルトの方法ではありません。

于 2012-06-27T20:53:05.700 に答える
3

レイモンド・ヘッティンジャーのsuper()は、superと見なされ、これに対処する方法についていくつかの情報を持っています。それは「実用的なアドバイス」のセクションにあります。

于 2012-06-27T21:02:57.550 に答える