4

Python コードで次のように表示されないのはなぜですか?

class A:
    def __init__(self, ...):
        # something important

class B(A):
    __init__ = A.__init__

私のボックスでは、Python 2.5、2.6、2.7、および PyPy 1.8 で動作するようです。

代わりに、次のことがよく見られます。

class B(A):
    def __init__(self, *args, **kwargs):
        A.__init__(self, *args, **kwargs)

または何かを使用してsuperいます。

私は最初の例の方が気に入っています (明示的は暗黙的よりも優れています!) が、何らかの理由でそれがコーシャではないのではないかと心配しています。何か問題や悪いことがありますか?

編集:はい、そうではA.__init__ありませんself.__init__

4

1 に答える 1

10

確かに、それはうまくいくでしょう(あなたが正しく理解できれば、それはあなたの例にはありません)が、それを行う理由はありません。'sBを呼び出したい場合は、 onを定義しないでください。これは自動的に行われます。結局のところ、それが継承の要点です。A__init__()__init__()B

__init__()forを書きたいと思う唯一の理由は、インスタンスの初期化に加えて、インスタンスの初期B化時に何かをしたい場合です。その場合、 を呼び出すだけでなく、追加のコードを記述することになるため、単純な割り当てもそこには適していません。BAA.__init__()

がモンキーパッチによって に変更されるBのを防ぎたい場合は、これを使用できると思います。しかし、それはむしろエッジケースのようです。さらに悪いことに、これは予期しない動作であり、Python の動的な性質をあからさまに否定しています。__init__()A

于 2012-05-23T22:19:40.563 に答える