.net column
.NET開発者のためのブログメディア

Pythonのsuper関数の使い方について解説!そもそもPythonのsuperとは?

公開日時:   更新日時:
Pythonのsuper関数の使い方について解説!そもそもPythonのsuperとは?
基本情報技術者試験の試験対策はこちら>>
SE
Pythonのsuper関数について教えていただけますか。
PM
分かりました。super関数を理解する上で不可欠なクラスと継承、インスタンス、メソッド、アトリビュートなどについてもサンプルプログラムを交えながら解説しましょう。

Pythonのsuperとは?


Pythonのsuperとはスーパークラス(親クラス)に関するオブジェクトを返す関数です。super関数が返すオブジェクトを使うと親クラスの「メソッド」にアクセスすることができます。ちなみにこのオブジェクトを使ってアトリビュートにアクセスすることはできません。

上記の説明で分かってしまった方は、以下を読む必要はありません。良く分からないという方は、クラスと継承の他、インスタンス、メソッド、アトリビュートなど関連するものを一通り理解しないと「良く分からない」と思いますので、その辺の解説をします。

以下に示すプログラムはPython3で動作させてください。動作確認はWindows10とPython3.9.1を使用して行いました。

クラスについて

Pythonはオブジェクト指向のプログラミング言語です。「オブジェクト指向」の「オブジェクト」とは大雑把に言いますと「関連するプログラムとデータをひとまとまりにしたもの」ということになります。

データを操作するにはプログラムが必要ですが、そのデータとプログラムをひとまとめにしてブラックボックスにしてしまえば、後は使い方さえ分かっていれば問題なくそのオブジェクトを使うことができます。

クラスとはオブジェクトの設計図のようなものです。アトリビュート(クラス内の変数)と、メソッド(クラスで定義した関数をメソッドと言います)の定義をします。定義と言ってもPythonの場合はアトリビュートを使うとき(変数に代入しようとしたとき)に自動的に作成されますので、実質的にはメソッドの定義と言っても良いでしょう。

以下に簡単なExampleClassクラスの定義を示します。この関数はメソッドを定義していないので何もしないクラスになります。インスタンスとは、classで定義(設計)した内容を元にメモリ上に実体化したもの(オブジェクト)です。

クラスの継承

クラスは設計図のようなものなので既存のクラスを継承して機能を拡張したり、改良したりできます。

下記のプログラムの親クラスではaddとpiメソッドを定義しています。子クラスは親クラスを継承していますので、addメソッドとpiメソッドを使用できます。更に子クラスでは、新たにsubメソッドを定義しています。

また、子クラスではpiメソッドを改めて定義(オーバーライド)しています。オーバーライドした場合は、改めて定義した方のメソッドが実行されますので、この場合には円周率のリターン値の精度が上がります。

しかし、オーバーライドする前の(親クラスの)メソッドを呼び出したいということもあります。そんな時に使われるのがsuper関数です。詳細は後述します。

なお、継承元となるクラスは「基底クラス」「親クラス」「スーパークラス」などと呼ばれ、継承先となるクラスは「派生クラス」「子クラス」「サブクラス」などと呼ばれています。

Pythonのsuper関数の使い方


Pythonのsuper関数はPython3とPython2で書き方が異なります。ここではPython3の書き方で解説します。

まずはsuper関数を使ったサンプルプログラムを紹介します。それと2つのクラスを継承したときのsuper関数の動作を解説します。

super関数を使ったサンプルプログラム

Pythonのsuper関数を使うときというのは、継承する(オーバーライドする)メソッドの機能を拡張したいときなどでしょう。単純な置き換えで機能拡張しようとすると、親クラスのメソッドのコードも含めて記述する必要がありますが、親クラスのメソッドを呼び出すことで、その部分のコードを書く必要がなくなります。

下記にsuper関数を使って機能拡張したメソッドのサンプルプログラムを示します。2つあるメソッドともsuper関数を使って機能拡張しています。

2つのクラスを継承したときのsuper関数の動作

2つのクラスを継承したとき、どちらのクラスにも同じ名前のメソッドがあるとsuper関数は正しく選択することができません。

Pythonの探索アルゴリズムが分かっていれば使える可能性もありますが、不具合の原因になることも想定しましょう。そういった理由でsuper関数は使えない(使わない)ので継承したクラスのメソッドを直接呼び出す必要があります。

以下のサンプルプログラムは、親クラス2つ(Info、 Info2)を持つ子クラス(PersonalInfo)からsuper関数を使わないで直接親クラスのメソッドを呼び出しているサンプルプログラムです。

SE
2つのクラスを継承したときにどちらのクラスにも同じ名前のメソッドがあるとsuper関数は正しく選択できないのですか。
PM
その通りです。2つのクラスを継承したときどちらのクラスにも同じ名前のメソッドがあるときは継承したクラスのメソッドを直接呼び出す必要があります。

最後に

Pythonはクラスの多重継承ができるプログラミング言語です。多重継承は、便利な機能です。上手く活用すれば多重継承のときでもsuper関数は「使える関数」になるでしょう。実際にご自身でコードを書いて理解を深めて下さい。


.NET分野でのキャリアアップをお考えの方は、現在募集中の求人情報をご覧ください。

また、直接のエントリーも受け付けております。

エントリー(応募フォーム)

Search

Popular

reccomended

Categories

Tags