2014/01/23

Python の super() 関数の使い方

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

まずは例を見てみましょう。

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)

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

意図としては、スーパークラス Dog__init__() メソッドの中に name アトリビュートを初期化する処理がすでに存在するので、それをサブクラス UltraDog の中でも再利用しよう、というものです。

( Python 2 での) super() 関数の使い方は super(クラス, インスタンス自身).メソッド名() です。わざわざ親クラスとインスタンス自身を super() に渡すのは、書き方としてちょっと気持ち悪い気もしますが、「 Explicit is better than implicit 」のポリシーを優先した感じでしょうか。

これを使う際の注意点は、親クラス(上の例では Dog )で object クラスを継承する必要がある、という点です。これを忘れて次のように宣言してしまうと super() がきちんと動いてくれず「 TypeError: must be type, not classobj 」と怒られてしまいます。

class Dog:
   ...


以上です。

ちなみに Python 3 では super() の引数を省略して次のように書くことができます。

super().__init__(name)


参考

0 件のコメント: