Pythonでスーパークラスを取得する方法:super()

super()を使ってスーパークラス(親クラス、基底クラス)を取得する方法について説明します。

Pythonでは、他のクラスベースのオブジェクト指向言語同様、クラス間に継承関係を持たせることができます。

super()を使うことで、サブクラスからスーパークラスの持つメソッドを利用することができます。

super()を使ってスーパークラスのメソッドを呼び出す

クラスが継承関係にある時、元となるクラスをスーパークラスと呼び、スーパークラスを継承したクラスをサブクラスと呼びます。

super()を使うと、サブクラスからスーパークラスを参照し、スーパークラスのメソッドを利用することができます。

次の例はSubClassのコンストラクタからSuperClassのコンストラクタを呼び出しています。

#スーパークラス
class SuperClass(object): #objectクラスを継承するのを忘れない
	def __init__(self):
		self.name ="Taro" #nameを初期化
		
#サブクラス
class SubClass(SuperClass): #SuperClassを継承する
	def __init__(self):
		super(SubClass, self).__init__() #super()を使ってスーパークラスの__init__()を呼び出す

if __name__ == '__main__':
	sub = SubClass()
	print sub.name #Taro

ここでは、サブクラスの__init__()メソッドからスーパークラスの__init__()メソッドを呼び出すことで、nameを初期化する処理をサブクラスから再利用しています。

super()を使う際は、第一引数に自クラスを、第二引数にはインスタンスを指定します。

なお、Python3.x系では、super()の引数は省略することができます。

super()を使う上での注意点

super()を使わずに、「スーパークラス名.メソッド名」でスーパークラスのメソッドを呼び出すこともできます。

しかし、スーパークラスのメソッドはsuper()を使って呼び出すことが推奨されています。

次のサンプルプログラムを見てみましょう。

class SuperClass(object):
	def sayHello(self):
		print "Hello"
		
class SubClass(SuperClass):
	super(SubClass, self).sayHello() #SuperClass.sayHello(self)と同じ?
	
if __name__ == '__main__':
	a = SubClass()

実行結果

Hello

サブクラスからスーパークラスのsayHello()メソッドを呼び出しています。

この時、super(SubClass, self).sayHello()は一見SuperClass.sayHello(self)に書き換えられるように見えます。

ただし、この記法は(特に多重継承を用いている場合は)推奨されません。スーパークラスのメソッドはsuper()を使って呼び出すようにしましょう。