お役立ち情報

Pythonでclassをどう使う?技術顧問に聞いてみた!

Pythonのクラス

Pythonは完全にオブジェクト指向型のプログラミング言語で、プリミティブ型の記述方法を採用していません。オブジェクト指向学習の最初の言語としてJavaを採用するケースも多いですが、Javaはオブジェクト指向型の書き方もできれば、プリミティブ型の書き方もできます。

オブジェクト指向型とプリミティブ型の違いはメモリ領域の取り方です。オブジェクト指向型の書き方ではオブジェクトのためのメモリ領域を確保したら、オブジェクトを使用する度にメモリのそこの領域を読みに行きます。

一方で、プリミティブ型の記述ではオブジェクトのように複数の場所から何度も同じメモリ領域を読みに行くことがありません。オブジェクト指向はインスタンス生成等で便利な面もありますが、メモリの節約にもなるのです。

こういった違いがありますが、よくわからない場合はスルーしておいてください。とりあえずメモリの使い方が異なるということです。話をPythonに戻すと、Pythonはオブジェクト指向の書き方しかできないため、Javaなどよりもオブジェクト指向を学習するのにちょうど良い言語だという意見もあります。

実際、Javaではオブジェクト指向の書き方もプリミティブ型の書き方もできるため、どう違うのかよくわからないまま学習しているケースも多いかと思います。そこでこのページでは、Pythonを例に、オブジェクト指向プログラミングにおけるclassの役割、使い方について解説していきます。

プログラミング画面

オブジェクト指向におけるclassとは?

オブジェクト指向プログラミングにおけるclassとは、オブジェクトを作るための設計図です。Pythonに限らずオブジェクト指向言語ではclassの宣言をベースにプログラミングを進めていきますが、classはすべてオブジェクト生成のための設計図になります。

Javaなどではメインclassのなかでプリミティブな書き方をするケースも多いためよくわからなくなるかもしれませんが、classは本来設計図なので、classからオブジェクトを作り出すことで処理を行います。

classからオブジェクトを作り出すことをインスタンス生成と言います。図にすると以下のようになります。

class→インスタンス生成→オブジェクト

classからオブジェクトを作り出す処理が、インスタンス生成と覚えておくとわかりやすく、混同せずに済むかと思います。ただし、ややこしいことにclassに関係する概念はあと何個か存在します。

それでは、classと関係するその他の概念についても解説していきます。

classに関係する概念

classに関係する概念について上で少し説明しましたが、網羅的に挙げると以下のような概念があります。

  • オブジェクト
  • インスタンス生成
  • カプセル化
  • 情報隠蔽
  • ポリモーフィズム
  • オーバーライド
  • 継承

以上のような概念がclassに関連します。

オブジェクトとインスタンス生成

まずオブジェクトとインスタンス生成は上で説明した通りです。classからインスタンス生成することでオブジェクトを作成し、そのオブジェクトが処理を行うということです。つまり、classがオブジェクトのための設計図になります。

カプセル化と情報隠蔽

次にカプセル化と情報隠蔽についてですが、この二つの概念はセットになります。まずカプセル化とは、一連の処理を一つのclassにひとまとめにすることを指します。そして、そのカプセル化したclassを外部からアクセスできないようにする概念が情報隠蔽になります。

カプセル化という言葉だけで情報隠蔽を含むと考えるケースもあれば、情報隠蔽した際のclassのことをカプセル化されたclassと言う場合もあり、正直なところ言葉の定義は曖昧です。

なので書籍やWebサイトによって解説はまちまちなのですが、とりあえずclassを外部から容易にアクセスできないようひとまとめにすることをカプセル化や情報隠蔽と呼ぶ、と覚えておくとわかりやすいでしょう。

ちなみにPythonでのカプセル化の方法は、変数やメソッドの前に「__」を付けることでカプセル化できます。そのまま書くとわかりにくいのですが、「_(半角アンダーバー)」を二つ付けています。

Javaなどではprivateと書きますが、Pythonではアンダーバー二つです。アンダーバーを二つ付けてカプセル化すると、外部から参照できなくなります。外部から参照するためにはゲッターとセッターというメソッドの概念があり、これを使用することでカプセル化されたclassにも外部からアクセスできるようになります。

Javaなどと同様にPythonでも文法に従ってget、setを記述すればアンダーバー二つでアクセスを制限しているclassのメソッドも使えるのですが、get、setの記述でカプセル化したclassにアクセスしていたら、カプセル化した意味がない、という意見もあります。

言うなれば、classに鍵を掛けたけれど、誰でも簡単に開けられるような状態です。さらにPythonではより簡単にカプセル化されたclassにアクセスできるプロパティが用意されており、以下のように対応しています。

  • getter→@property
  • setter→@属性名.setter
  • deleter→@属性名.deleter

要するに、Pythonではカプセル化したclassにアクセスするための鍵が複数用意されており、メソッドを簡単に使用できます。

プログラミングする人

ポリモーフィズム

次にポリモーフィズムについてですが、多相性と和訳されます。そして、オーバーライドと継承もポリモーフィズムとセットで出てくる概念になります。まず目的から理解するとわかりやすいですが、ポリモーフィズム、オーバーライド、継承は大枠では同じ目的に使われるもので、「classの拡張利用」が主な目的になります。

classからインスタンス生成でオブジェクトを作って処理を行うのがオブジェクト指向言語の主な仕様で、classが設計図になることは上で説明した通りです。そして、当然ながらなるべくならいろいろなオブジェクトに対応できるclassを定義した方が汎用性があります。

この考え方がポリモーフィズムで、多相性ということです。そのポリモーフィズムの考え方とセットになるのが継承とオーバーライドです。まず継承とは、別classの定義を引き継いで新たなclassを作る概念になります。

大元のclassをスーパークラス、継承によって作った新たなclassをサブクラスと呼びます。ただし、当然そのまますべて同じように継承したらまったく意味がありません。同じ内容のclassが複数できるだけです。

オーバーライド、継承

そこで登場する概念がオーバーライドです。継承によってスーパークラスを引き継いでサブクラスを作りますが、その継承してできたサブクラスの中身を書き換える概念がオーバーライドになります。

オーバーライドによって書き換えるのはメソッドで、サブクラスではスーパークラスから継承したメソッドと、オーバーライドによって書き換えたメソッドの両方が使えることになります。

classを使い回すための概念がポリモーフィズムで、ポリモーフィズムを実現するためにスーパークラスからサブクラスを作り出す概念が継承、その継承のなかでメソッドを書き換えるための概念がオーバーライドということです。

まとめ

それぞれの言葉の定義を明確に覚える必要はありませんが、classに関係する概念や、それぞれの使い方について説明してきました。Pythonは完全にオブジェクト指向型の言語なので、説明してきた概念に基づいてプログラミングを進めることになります。

個々の詳細な記述方法ももちろん重要なのですが、ざっくりとでも良いので概念は把握しておいてください。概念を把握しないまま個々の記述方法だけを追いかけても結局コピペによるつぎはぎになってしまうため、大枠を捉えていくことが重要です。

キャリアカウンセリングのプロとして
あなたに合った案件をご案内します。

まずはお気軽にお問い合わせください!

イメージ