Pythonのsuper()と__init__()メソッドの理解

私はsuper()の使い方を理解しようとしています。見たところ、どちらの子クラスも問題なく作成できています。

次の2つの子クラスの実際の違いについて知りたいと思います。

class Base(object):
    def __init__(self):
        print "Base created"

class ChildA(Base):
    def __init__(self):
        Base.__init__(self)

class ChildB(Base):
    def __init__(self):
        super(ChildB, self).__init__()

ChildA() 
ChildB()
ソリューション

super()`を使うと、基底クラスを明示的に参照しなくて済むので、便利です。しかし、主な利点は多重継承にあり、そこではあらゆる種類の楽しいことが起こり得ます。まだご覧になっていない方は、superに関する標準的なドキュメントをご覧ください。

Python 3.0で構文が変わった]3ことに注意してください: super(ChildB, self).__init__()の代わりにsuper().__init__()と言えばいいのですが、これはかなりすっきりしています。標準のドキュメントでは、guide to using super()も参照されていて、かなり説明されています。

解説 (5)

Python 2.7では、そしてバージョン2.2でsuper()が導入されてからは、親の一方が最終的にobjectを継承するクラスを継承している場合にのみ、super()を呼び出すことができます(新スタイルのクラス)。

個人的には、python2.7のコードに関しては、実際にsuper()を使うメリットが出てくるまでは、BaseClassName.__init__(self, args)を使い続けるつもりです。

解説 (2)

実際にはありません。super()は、MRO(メソッド解決順序、cls.mroでアクセス)で次のクラスを見て、メソッドを呼び出します。ベースのinitを呼び出すだけで、ベースのinitを呼び出します。たまたま、MROにはちょうど1つのアイテム、ベースがあります。つまり、全く同じことをしているのですが、super()`を使った方がより良い方法なのです(特に、後に多重継承になった場合)。

解説 (6)