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()
2357
3
super()`を使うと、基底クラスを明示的に参照しなくて済むので、便利です。しかし、主な利点は多重継承にあり、そこではあらゆる種類の楽しいことが起こり得ます。まだご覧になっていない方は、superに関する標準的なドキュメントをご覧ください。
Python 3.0で構文が変わった]3ことに注意してください:
super(ChildB, self).__init__()
の代わりにsuper().__init__()
と言えばいいのですが、これはかなりすっきりしています。標準のドキュメントでは、guide to using super()も参照されていて、かなり説明されています。Python 2.7では、そしてバージョン2.2で
super()
が導入されてからは、親の一方が最終的にobject
を継承するクラスを継承している場合にのみ、super()
を呼び出すことができます(新スタイルのクラス)。個人的には、python2.7のコードに関しては、実際に
super()
を使うメリットが出てくるまでは、BaseClassName.__init__(self, args)
を使い続けるつもりです。実際にはありません。super()
は、MRO(メソッド解決順序、
cls.mroでアクセス)で次のクラスを見て、メソッドを呼び出します。ベースの
initを呼び出すだけで、ベースの
initを呼び出します。たまたま、MROにはちょうど1つのアイテム、ベースがあります。つまり、全く同じことをしているのですが、
super()`を使った方がより良い方法なのです(特に、後に多重継承になった場合)。