オブジェクト指向って何ですか?
プログラミングにおける重要な考え方だ。
Pythonを使って解説しよう。
✔️ 本記事のテーマ
Pythonにおけるオブジェクト指向
✔️ 読者さんへの前置きメッセージ
本記事は「Pythonにおけるオブジェクト指向とは」について書いています。
この記事を読むことで
「オブジェクト指向という考え方 や オブジェクト指向をPythonで表現する方法」
を理解できます。
Pythonに限らずプログラミングの世界において、
オブジェクト指向の考え方はとても重要です。
これからプログラミングを学ぶ人や既に少しプログラミングを知っている人でも、
必ず抑えておくべき考え方と言えるでしょう。
そんなオブジェクト指向について、
この記事ではPythonでのコードを使って説明していきます。
それでは、Pythonでのオブジェクト指向について詳しく解説していきましょう。
オブジェクト指向とは?
オブジェクト指向とは、プログラミングでよく用いられる設計思想です。
もはや今では「オブジェクト指向について理解していること」が
優れたプログラマの条件の一つでもあると言えます。
ところが、オブジェクト指向を一言で説明するのはとても難しいです。
大まかな考え方としては
「役割ごとにプログラムを作成する」といった捉え方をすればOKです。
例えば、プログラムを学びたてのプログラマは、
一つのメイン処理に全てを詰め込むような書き方をするでしょう。
それから少し慣れてくると、
それぞれの機能単位で関数分割されたプログラムを書くようになるはずです。
参考記事:プログラミングで関数を作る意味とは?
オブジェクト指向は、
それらの関数のさらに上の階層としてクラスを定義して、
役割ごとにクラス分割します。
おそらく文字ベースでの説明だけではイメージがしにくいと思うので、
次からPythonのコードを使って解説しましょう。
Pythonにおけるオブジェクト指向
まずオブジェクト指向の基本は、クラス、プロパティ、関数 の構造です。
以下のようなサンプルコードで語られることが多いです。
class Human:
def __init__(self, name, age):
self.name = name
self.age = age
def introduce(self):
print('私の名前は' + self.name + 'です。')
print('年齢は' + str(self.age) + 'です。')
順番に、解説していきましょう。
オブジェクト指向をPythonコードで読み解く
今回は「人間クラス」を定義しています。
class Human:
そして、この人間クラスのプロパティとして「名前」「年齢」を定義します。
def __init__(self, name, age):
self.name = name
self.age = age
さらに、人間クラスの機能として「自己紹介」関数を用意しています。
def introduce(self):
print('私の名前は' + self.name + 'です。')
print('年齢は' + str(self.age) + 'です。')
このように「クラスを基本として、そのクラスの機能やプロパティとして変数や関数を定義していく」という考え方をオブジェクト指向といいます。
言い換えれば、オブジェクトをベースに、
そのオブジェクトの性質や機能として処理を定義する考え方ですね。
上記のサンプルコードは呼び出すときも、以下のようにオブジェクトベースで考えます。
tanaka = Human('田中', 20)
sato = Human('佐藤', 40)
tanaka.introduce()
sato.introduce()
# 出力
私の名前は田中です。
年齢は20です。
私の名前は佐藤です。
年齢は40です。
このように、名前と年齢を渡してインスタンスを生成することで、
人間クラスの「自己紹介」関数を使えるようになります。
Pythonの「オブジェクト指向3大原則」とは?
ここまでオブジェクト指向の全体像を説明しました。
さらに、オブジェクト指向には「3大原則」と呼ばれる原則があります。
それが以下の3つです。
- カプセル化
- 継承
- ポリモーフィズム
基本的にオブジェクト指向はこの3つの考え方で成り立っています。
順に、解説していきましょう。
カプセル化(Pythonコード)
カプセル化とは
「プログラムの外部からの操作を制御し、プログラムの独立性を保つための仕組み」
です。
コードで表すと以下のようになります。
class Human:
def __init__(self, name, age):
self.name = name
self.age = age
def setter_age(self, age):
self.age = age
def getter_age(self):
return self.age
オブジェクト指向では、
上記のコードのように関数を通してクラスのプロパティを操作します。
こうすることで、各クラスのプロパティを直接編集したり、参照しなくて済むので、プログラムの独立性や機密性が保つことができます。
このように、setter、 getter関数を通して、
プロパティを操作するという考え方がカプセル化です。
継承(Pythonコード)
継承とは
「各クラス(機能)を共通のクラスを基にして(引き継いで)作成するという考え方」
です。
この共通のクラスのことを、よくスーパークラス(基底クラス)などと呼びます。
from abc import *
class Human(metaclass = ABCMeta):
def __init__(self, name, age):
self.name = name
self.age = age
@classmethod
@abstractmethod
def introduce(self):
print('私の名前は' + self.name + 'です。')
print('年齢は' + str(self.age) + 'です。')
class Student(Human):
pass
上記のコードでは、Studentクラスで特に何も定義していません。
しかし、StudentクラスはHumanクラスを継承しているので、
Humanクラスのプロパティ、関数が使用できるのです。
Suzuki = Student('鈴木', 15)
Suzuki.introduce()
# 出力
私の名前は鈴木です。
年齢は15です。
このように、全てのクラスをスーパークラスを継承して作成することで、
プログラムの整合性を保つことができます。
それにより、意図していない実装を防ぐことで、
バグを減らしたり、コードの品質を高めることができます。
ポリモーフィズム(Pythonコード)
最後に、ポリモーフィズムについて解説します。
ポリモーフィズムとは、
ざっくり言うと「同じ機能は同じ名前で定義しよう」という考え方です。
別のクラスの機能でも、同じ名前として定義しておくことで、それらを呼び出すときに各クラスの違いを意識せずに使うことができます。
例えば、pythonでは以下のように数字でも文字列でも同じように足すことができます。
>>> 1+2
3
>>> 'a'+'b'
'ab'
同じ「足す」という処理を、
数字クラス、文字列クラスの機能として同じ名前で定義することで、
機能を使う側にとって便利な実装になります。
このようにポリモーフィズムを使うことで、
新たなクラスを追加したなどに他への影響を減らすことができるので、
保守性の高いプログラムを作成することができます。
オブジェクト指向やPythonについてもっとスキルをつけるなら
オブジェクト指向について解説しました。
オブジェクト指向はプログラミングを仕事にする人にとって不可欠の考え方です。
オブジェクト指向について正しく概念を理解するなら、以下の書籍がオススメです。
この書籍はオブジェクト指向についてかなり丁寧に書かれています。
「オブジェクト指向とは?」だけでなく「なぜオブジェクト指向を使うのか?」
といった背景や理由の部分まで丁寧に解説されています。
そのため、オブジェクト指向の全体像から詳細まで正しく理解することができます。
オブジェクト指向の理解を深めたい方にオススメの一冊です。
エンジニアとしての自身の価値をチェックする(完全無料)
エンジニアとして、
自分の価値がどれくらいのものかご存知でしょうか?
エンジニアとしてIT業界に身を置いていると
今の会社でずっと働くのか、フリーランスとして独立するのか …
と様々な選択肢があります。
どの選択肢が正解なのかを見極めるためにも、選択肢を広げるためにも
自身の価値を知っておくことはとても重要です。
TechClips ME では、
職務経歴書をアップロードするだけで企業からのスカウトを受けることができます。
▼▼▼▼▼
▲▲▲▲▲
しかもTechClips MEでは想定年収を企業から提示してくれるので、
自身の価値を数字で分かりやすくたしかめることができます。
登録はもちろん完全無料なので、一度登録してみると良いかもしれません。
コメント