python3の日記

Python3を図書とともに勉強していくブログ

Pythonにおけるオブジェクト指向【基礎編】

f:id:pokita:20180421094155p:plain

 

オブジェクト指向、なんとなく聞いたことあるかも知れない。しかし、ちょっと読んでも何言っているかわからず敬遠しがちな言葉。

「はじめてのPythonでも22章から入る概念だしいまは知らなくてもいっか」

で教科書に出てきても無視して読み進めてきたけどそれを学び始めた今になって気づく。

「これこそPythonの柱じゃん」って。

 

そういわけで、今回はPythonをこれか学ぶに当たってまず抑えておきたい基礎の基礎、オブジェクト指向について。これを知ってると、まったく教科書の吸収スピードが異なるので先に基礎だけ抑えておこう。

オブジェクトとは?

プログラムを作る場合、全体を小さな処理に分割してひとつひとつの処理を作成し、それらを組み合わせて全体のプログラムを完成させます。このとき、基本的な部品となるのが関数データです。

 

【関数】

入力したデータ(引数)を処理してその結果(戻り値)を返すプログラムのこと。数学でやったy=f(x)と同様。yが戻り値でxが引数。

 

【データ】

関数が動詞だとするとその副詞。どのような性質を持つかが定義されている。

 

オブジェクト指向プログラミングでは関数とデータではなく「オブジェクト (object) を部品として扱います。

 

【オブジェクト】

機能とデータを併せ持ったもの。

たとえば、えんぴつを考えてみよう。えんぴつには、色、長さ、固さ、などいろいろな性質がある。そして、えんぴつを使って文字を書いたり絵を描いたりすることができる。プログラムでは、このような性質をデータで表し機能を関数で表すことになる。そしてオブジェクトとは、このデータと関数を結び付けたもの。

 

いままでのプログラミング言語ではデータと関数を別々に定義するため、それをひとつのオブジェクトとして表すことができなかった。えんぴつで文字を書くにも、えんぴつの種類を定義(データ)文字を書く(関数)ようにプログラムしなければいけなかった。

 

ところが、オブジェクトはデータと関数を結び付けたものなので、自分がなにをしたらよいかわかってる。えんぴつオブジェクトに文字を書けと命じればそれが赤えんぴつのオブジェクトであれば文字は赤に黒えんぴつのオブジェクトであれば黒い文字になる。

クラスとインスタンスとは?

また、オブジェクト指向プログラミングでは実際に部品となり機能するオブジェクトインスタンスその設計図(クラス)は別々に存在するため簡単にインスタンスを作ることができる。

 

例えば、「"黒"えんぴつで"a"と書く」という部品を作った後「"赤"えんぴつで"b"と書く」という部品も必要になったとする。この際、オブジェクト指向であれば、「"黒"えんぴつで"a"と書く」という部品の設計図を少しいじることで簡単に「"赤"えんぴつで"b"と書く」という部品を作ることができる。

これは設計図と部品自体がごっちゃになっている、CやVB等の言語にはできない芸当。

下はそのたい焼きの喩え。

f:id:pokita:20180421141901g:plain

 

【クラス 】

インスタンスの振る舞いを定義した設計図。ここでデータを格納するための変数やそれを操作する関数が定義される。

この変数をクラス変数といい、関数をメソッド (method) という。クラスはあくまでも設計図なのでそこで書いたプログラムを走らせるにはまず部品に落とさなければならない。クラスはイデアにすぎないからだ。

 

インスタンス

クラスを元にして作られるオブジェクト。ビルドインオブジェクトのstrやint同様にクラスで定義された内容に基づいて属性を持っている。それがインスタンス変数メソッドである。また、インスタンスはそれぞれ独立した名前空間も持っている。

class C :
b = "b"

ins = C()
print(ins.b)
>>>b
#ins=C()によりクラス変数のbがinsのインスタンス変数になった

print(b)
>>>NameError: name 'b' is not defined
#bはクラスorインスタンス変数なので、オブジェクトがないと使えない
ins.b = "B"

print(ins.b)
>>>"B"
#代入によりinsのインスタンス変数bが上書きされた

メソッドとは?

簡単に言うとオブジェクトと結びついた関数のこと。個別のオブジェクトの専用関数といったところ。

 メソッドは、クラスが異なっていれば同じ名前のメソッドを定義することができる。クラスMornning にメソッド greet() が定義されていても、クラスEveningに同名のメソッド greet() を定義することができる。

class Mornning:
  def greet(self):
  print("Good morning!")

 

class Evening:
  def greet(self):
  print("Good evening!")


a = Mornning()
a.greet()

>>>Good morning!
b = Evening()
b.greet()

>>>Good evening!

これは、インスタンス自体がそれぞれ独立した名前空間もっており、各メソッドはそれに属する関数だからである。オブジェクトが属するクラスによって実行されるメソッドが異なるこの機能をポリモーフィズム(polymorphism) 」と呼ぶ。

 

演算子もオブジェクトに属する言わばメソッドでありその働きがビルトインオブジェクトの文字列と数値で違うのもこのポリモーフィズムの一例に挙げられる。

x = 1
y = 2
x + y #数値オブジェクトにおける「+」
>>>3
X = "1"
Y = "2"
X + Y #文字列オブジェクトにおける「+」
>>>"12"

基礎なので今回はここまで。

次は【初めてのPython22章】の記事で会いましょう!