はじめに
今回の記事からは、プログラミングの基本をふまえて、より多くの機能を持ったプログラムや実用的なアプリを作成するうえで便利な「オブジェクト指向」や「クラス」について解説していきます。
つまずきやすい部分(実際に筆者がつまずいた部分)を中心に、初心者にわかりやすく順を追って説明していきます。
もくじ
- はじめに
- オブジェクト指向って何?・・・プログラムを書く時の考え方のこと
- なぜ学ぶのか・・・複雑なプログラムの修正を楽にできる
- クラスって何?
- データとメソッド(処理)がまとまっているもの
- 「クラス」と「インスタンス」について
- クラスを自分で作ってみよう
- まとめ
オブジェクト指向って何?
オブジェクト指向とはいったい何なのでしょうか。ざっくり言うとオブジェクト指向とは、プログラムを書くときに使う考え方のことです。
オブジェクトとは物体、モノのことです。オブジェクト指向とは、広い意味ではプログラムを現実世界のモノに見立てようとする考え方です。
これまでのプログラムは、関数や変数をバラバラに作り、最後にまとめて呼び出すことで作成していました。しかしオブジェクト指向では、すべてをバラバラに作るのではなく、モノを基準にして、そのモノに必要なものをまとめておくという考え方をします。
オブジェクト指向の考え方でプログラミングをする場合、具体的にはクラスと呼ばれるまとまりを用います。クラスによってプログラムを整理していくことが可能です。
これまでの勉強ブログでも、何度も使うような処理を関数にまとめたりするなど、プログラムの整理が重要であることを説明しました。
クラスとよばれるまとまりを使うと、使う変数やメソッド(処理)を関連付けて限定することができます。たとえば、「車」クラスのなかで定義したメソッドは、車を動かすときにしか使えないようにできるといったものです。クラスのなかで処理に値するメソッドは関数と異なり、そのクラスが用いられている部分でしか使用することができません。
オブジェクト指向をなぜ学ぶ?
規模の大きいプログラムや共同作業でアプリケーションを作る段階になると、これまでのように変数と関数に分けていくだけでは、どの変数や関数をどのタイミングで呼び出すか・今呼んでもいいのか?などが分かりづらくなります。クラスを用いて変数や関数をまとめることによって、不具合を出しづらくしたり、簡単に修正を行えるようにすることができます。
また、オブジェクト指向という考え方を用いることで、それに基づいた便利な考え方を取り入れることができます。まずは基本的な「クラス」と「インスタンス」について解説し、便利機能である「カプセル化」「ポリモーフィズム」「継承」については、次回以降に解説します。
クラスって何?・・・「クラス」と「インスタンス」
クラスというまとまりを使うと、使う変数やメソッド(処理)を関連付けて限定できることを解説しました。それでは、「車というクラスを定義して、クラスの中に必要な処理をメソッドとして定義した!これで車ができた!動かすぞ!」・・・と思いますが、実はこのままではクラス(≒車)を動かすことはできません。
作ったクラスはあくまで概念であり、車の鋳型のようなものです。よって、実体を作らなければ車そのものを動かすことができないのです。
この実体のことを「インスタンス」と呼びます。
クラス(型)とインスタンス(実体)という考え方には、実はもうすでに触れています。
たとえばpythonにはリストという「型」があり、リストをひとつ定義すると、リストにある「メソッド」(リストに値を追加するメソッド、リストから値を取り除くメソッド…etc)を使用することができます。このメソッドはリストにしか使用できません。
ここでいうリストという概念が「クラス」で、実際に定義したものは「インスタンス」にあてはまります。
この「クラス」と「インスタンス」はオブジェクト指向の考え方で重要になります。たとえばリストというクラス(型)だけでは複雑な処理はできませんが、これを独自に定義することによって「クラス」を自由に作成することができます。
さっそくクラスを作ってみよう!・・・クラスを定義する
早速クラスを作ってみましょう!たとえば、簡単な計算をしてくれる電卓クラスを作成してみます。クラス名は、~をしてくれるもの、といったような処理の名前ではなく、オブジェクト指向の「モノ」基準の考え方から、モノの名前を付けるとよいです。
class CalculateMachine(): # クラス「電卓」
def plus(self, x, y): # 足し算メソッド
return x + y
def minus(self, x, y): # 引き算メソッド
return x - y
クラス名の前にclassをつけ、それ以下にメソッドを定義していきます。今回は上記のように電卓クラスを作成しました。クラスを作成しただけでは、「リスト型」や「文字列型」などの型を作成しているのと同じです。実際にメソッドを呼び出すには、実体としての「インスタンス」を作成していきます。
myCal = CalculateMachine() # myCalという名称のインスタンスを作成
plus_result = myCal.plus(3, 2) # myCalに備わっているplusメソッドを使う
minus_result = myCal.minus(3, 2) # myCalに備わっているminusメソッドを使う
print(plus_result)
print(minus_result)
print(plus_result) 表示されるのは5
print(minus_result) 表示されるのは1
インスタンスには任意の名前を付けられます。インスタンスを作成すると、そのクラスの中のメソッドを呼び出して使用することができます。逆に、インスタンスがなければメソッドを呼び出すことはできません。クラスにおけるインスタンスの作成方法とメソッドの呼び方は以上になります。
クラスのメソッドの引数がおかしい? ・・・「self」って何?
Class Calculate machine のクラスのなかのメソッドを見てみると、def plus(self,x,y)というように引数が3つありますが、呼び出すときにはPlus_result= My Calculate machine.plus(3,2)のように引数を2つしか指定していません。これは、selfは呼び出すときには自動的に飛ばされる引数だからです。
selfにはそのクラスのインスタンスが入ります。クラスのなかでメソッドを定義するさいに必要なものになります。
def plus(self, x, y): # 足し算メソッド
plus_result = myCal.plus(3, 2) # 呼び出し時の引数に「self」がない
まとめ
オブジェクト指向とは、プログラムを現実世界のモノに見立ようとする考え方です。
この考え方にしたがってプログラムを書くには、クラスというまとまりを用いてプログラムを整理していきます。これにより変数や処理をひとまとめにして、限定的に使用できるため大規模なプログラムや共同作業において混乱を防ぎ、変更があっても修正がしやすくなります。
クラスのなかに記述されているメソッドは、クラスの「インスタンス(実体)」を作成することで使用することができます。クラスとはあくまでも概念であり、インスタンスという実体をつくる鋳型のようなものです。
「クラス」と「インスタンス」はオブジェクト指向の基本であり、これを使いこなすとさまざまな便利機能が使用できるようになります。
次回は、pythonにおけるクラスについての基本的な操作のしかたについて詳しく解説していきます。
ここまで読んでくださってありがとうございました!
コメント