Pythonで親クラス(スーパークラス)のメソッドを呼び出す場合、クラススタイルやPythonのバージョンよって方法が異なります。
※旧クラススタイル、新クラススタイルの詳細は新旧クラススタイルを参照してください。
新クラススタイル
Python 2系では
新クラススタイルの場合はsuper関数を使用します。super(自クラス名).メソッド名(引数)のような形で呼び出しますが、旧クラススタイルの呼び出し方法も利用可能です。
Python 2系
# -*- coding: utf-8 -*-
# 新スタイルクラス
class NewStyleClassBase(object):
def test_method(self, msg):
print 'NewStyleClassBase: {}'.format(msg)
# 新スタイルのクラスを継承
class NewStyleClass(NewStyleClassBase):
def test_method(self, msg):
print 'NewStyleClass: {}'.format(msg)
super(NewStyleClass, self).test_method(msg)
# NewStyleClassBase.test_method(self, msg)
new = NewStyleClass()
new.test_method('method call')
NewStyleClass: method call NewStyleClassBase: method call
Python 2系では新スタイルクラス、旧クラススタイルが選択できます。さらに新スタイルの方はどちらの方法でも呼び出しが可能ですが、可能な限りsuper関数を使用した方が良いでしょう。
Python 3系では
Python 3系では非常にシンプルな形でsuper関数を使用することができます。また旧来の呼び出し方法もサポートされています。
Python 3系
# 新スタイルクラス
class NewStyleClassBase(object):
def test_method(self, msg):
print('NewStyleClassBase: {}'.format(msg))
# 新スタイルのクラスを継承
class NewStyleClass(NewStyleClassBase):
def test_method(self, msg):
print('NewStyleClass: {}'.format(msg))
super().test_method(msg)
# super(NewStyleClass, self).test_method(msg)
# NewStyleClassBase.test_method(self, msg)
new = NewStyleClass()
new.test_method('method call')
NewStyleClass: method call NewStyleClassBase: method call
旧クラススタイル
旧クラススタイルの場合です。親クラス名.メソッド名(引数)のような形で呼び出します。親クラス名をハードコードしなければなりません。Python 3系では旧クラススタイルという概念はなく、新クラススタイルしかありません。
Python 2系
# -*- coding: utf-8 -*-
# 旧スタイルクラス
class OldStyleClassBase:
def test_method(self, msg):
print 'OldStyleClassBase: {}'.format(msg)
# 旧スタイルのクラスを継承
class OldStyleClass(OldStyleClassBase):
def test_method(self, msg):
print 'OldStyleClass: {}'.format(msg)
OldStyleClassBase.test_method(self, msg)
old = OldStyleClass()
old.test_method('method call')
OldStyleClass: method call OldStyleClassBase: method call
