super 関数の返す値についてメモ

基底クラスに定義されたメソッドを派生クラスから呼びたい。たとえば基底クラスのメソッドをオーバーライドするとき、基底クラスのメソッドを呼んで元々の処理をした上で、独自の処理を追加したい。組込みの super 関数があるので調査してみた。

# kissa.py                                                                      

class Base:
    def test(self):
        print('this class is ' + repr(self.__class__))

class Kissa(Base):
    def test(self):
        print(self)
        print(self.__class__)
        print(super())
        print(super().__class__)
        print(super(Kissa))
        print(super(Kissa, self))
        super().test()

実行してみる。

>>> import kissa
>>> k = kissa.Kissa()
>>> k.test()
<kissa.Kissa object at 0xb09cc6c>
<class 'kissa.Kissa'>
<super: <class 'Kissa'>, <Kissa object>>
<class 'super'>
<super: <class 'Kissa'>, NULL>
<super: <class 'Kissa'>, <Kissa object>>
this class is <class 'kissa.Kissa'>

わかったこと。

  • super を呼び出したときに返ってくるのは「super」という名前のクラスのインスタンス
  • super を引数なしで呼び出すと現在のクラス (self.__class__ ?) とインスタンス (self ?) つきで呼び出したのと同じ効果
  • super().test() などで基底クラスのメソッドを呼べる