Python の super() 関数の使い方

Python でスーパークラスのインスタンスメソッドを呼び出すときに使える super() 関数の使い方をご紹介します。

Python 3 の場合

まずは例を見てください。

class Dog:
    def __init__(self, name):
       self.name = name

class UltraDog(Dog):
    def __init__(self, name, type_):
        super().__init__(name)
        self.type = type_

ud1 = UltraDog("taro", "akita")
print(ud1.name)

このコードでは、 Dog のサブクラス UltraDog__init__() メソッドの中で super().__init__(name) という書き方を使ってスーパークラス Dog__init__() メソッドを呼び出しています。

Python 2 の場合

Python 2 の場合は Python 3 と少し違って、 super() 関数には 2 つの引数を渡す必要があります。具体的には super(クラス, インスタンス自身) とやって使います。

わざわざ引数を渡さなくてはいけないのは少し気持ち悪い・煩わしい感じがします。

上のサンプルは Python 2 では次のようになります。

class Dog(object):
    def __init__(self, name):
       self.name = name

class UltraDog(Dog):
    def __init__(self, name, type_):
        super(UltraDog, self).__init__(name)
        self.type = type_

ud1 = UltraDog("taro", "akita")
print(ud1.name)

Python 2 における注意点として、スーパークラス(このサンプルでは Dog )で object クラスを継承する必要があります。これを忘れると super() がきちんと動いてくれず「 TypeError: must be type, not classobj 」というエラーがあがります。

参考