KJR020 KJR020's Blog

Pythonの組み込み関数superについて

Python組み込み関数のsuperについて調べたことをまとめる

経緯

super()について、ライブラリの実装を読んでいると時々目にしていたが、
自分では使ったことがなかったので、中身の処理をよく理解していなかった。 DjangoのCreateViewの実装を理解したいと思い、その一環でsuper()について調べてみることにした。

調べてみる

まずは公式ドキュメントを読んでみる

class super(type, object_or_type=None)
メソッドの呼び出しを type の親または兄弟クラスに委譲するプロキシオブジェクトを返します。
これはクラスの中でオーバーライドされた継承メソッドにアクセスするのに便利です。

proxyオブジェクトを渡すらしいが、まだ良くわかってない super().get()とかsuper().post()とか具体的に動かしてみるとする

class Parent:
    def greet(self):
        """親クラスの挨拶メソッド"""
        print("Hello from Parent")


class Child(Parent):
    def greet(self):
        """子クラスの挨拶メソッド"""
        print("Hello from Child")
        super().greet()  # 親クラスのメソッドを呼び出す


# インスタンスの生成
parent_instance = Parent()
child_instance = Child()

# 挨拶を表示
child_instance.greet()

出力

> Hello from Child
> Hello from Parent

super()は、親クラスのメソッドを呼び出すための関数であるということだ。

super()の引数がどこからわたっているのか不思議だったが、
どうやら自動的にClassとselfが渡されるらしい

class C(B):
    def method(self, arg):
        super().method(arg)    # This does the same thing as:
                               # super(C, self).method(arg)

どうやって渡されているのかは、下記記事で調査されていた

Python3 とクラスと super - プログラマのネタ帳
Python3 では super() を呼び出す際に引数を省略できる。 例えば以下のように書くと、 super() は super(Derived, self) という呼び出しと等価になるらしい。 class Derived(Base): def __init__(self): super().__init__() そもそも明示を是とする Python で引数が省略できてしまうってのは気持ち悪いというのはかなりあるのだけども、どのように解決しているのだろうかなどと気になってしまったので調べてみた。 仕様 この仕様はどこで定義されているのかと PEP を調べてみたら PEP3135 で定義されて…
 Python3 とクラスと super - プログラマのネタ帳 favicon shomah4a.hatenadiary.org
 Python3 とクラスと super - プログラマのネタ帳

あまり理解できていないので、いずれもう少し深堀りしてみたい

Esc
キーワードを入力して検索