super()を使ってスーパークラス(親クラス、基底クラス)を取得する方法について説明します。
Pythonでは、他のクラスベースのオブジェクト指向言語同様、クラス間に継承関係を持たせることができます。
super()を使うことで、サブクラスからスーパークラスの持つメソッドを利用することができます。
super()を使ってスーパークラスのメソッドを呼び出す
クラスが継承関係にある時、元となるクラスをスーパークラスと呼び、スーパークラスを継承したクラスをサブクラスと呼びます。
super()を使うと、サブクラスからスーパークラスを参照し、スーパークラスのメソッドを利用することができます。
次の例はSubClassのコンストラクタからSuperClassのコンストラクタを呼び出しています。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
#スーパークラス 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()を使って呼び出すことが推奨されています。
次のサンプルプログラムを見てみましょう。
1 2 3 4 5 6 7 8 9 |
class SuperClass(object): def sayHello(self): print "Hello" class SubClass(SuperClass): super(SubClass, self).sayHello() #SuperClass.sayHello(self)と同じ? if __name__ == '__main__': a = SubClass() |
実行結果
1 |
Hello |
サブクラスからスーパークラスのsayHello()メソッドを呼び出しています。
この時、super(SubClass, self).sayHello()は一見SuperClass.sayHello(self)に書き換えられるように見えます。
ただし、この記法は(特に多重継承を用いている場合は)推奨されません。スーパークラスのメソッドはsuper()を使って呼び出すようにしましょう。