python オブジェクト指向とは

未分類

プログラムを勉強していて誰もがつまずく場所はやはりオブジェクト指向の考え方ではないでしょうか。

オブジェクト指向プログラムの

  • カプセル化
  • 抽象化
  • 継承
  • ポリモーフィズム

この4種類がオブジェクト指向プログラムを構成しています。

この考え方を使う言語はPython、Java、Rubyなどですね。

この概念的な考え方が初めはイメージするのに苦労しますよね

今回はこの4つを解説していきます。

継承とは

継承とその名のとおり自分の属性を引き継ぐことを言います。

class Player:

def __init__(self,h,w):

self.height=h

self.weight=w

def print_size(self):

print(“身長は{}体重は{}です”.format(self.height,self.weight))

class Human(Player):

pass

a_human=Human(180,60)

このようにHumanクラスの定義でパラメーターにPlayerクラスを指定したのでHumanくらすはPlayerクラスの変数とメソッドを継承しました。

この継承のおかげで同じものを何度も入力する手間を省くことができます。

ここでは誰もが知っているスマブラを例にしてみましょう。

スマブラにはたくさんのキャラクターがいますよね。

そのすべてのキャラクター1人1人に右入力を押したら右に行く。ジャンプボタンを押したら2回までジャンプできる。

このような作業をすべての入力を1回で表すことのできるのが継承です。

class Player:

def Move(self):

右をおしたら右に行く

  ジャンプボタンを押したら飛ぶ

  ガードを押したらガードする

適当に書きましたがこんな感じに1つその骨組みになるクラスを一つ作っておき各キャラクターに継承していきます。

ここに1キャラ1キャラの特徴を追加していけばよくなるのです。

例えばカービィはジャンプを5回できるやサムスはつかみが伸びるなどをあとから追加していくことで効率よく作業していくことができるのです。

カプセル化

カプセル化とは2つの概念をまとめたものです。

1つ目がオブジェクトによって複数の変数とメソッドをまとめることです。

2つ目がデータを外部から直接アクセスできないようにして書き換えられないように隠蔽するです。

この2つを理解することでカプセル化は理解できます。

オブジェクトによって複数の変数とメソッドをまとめること

まずは例を紹介します。

class Object:

def __init__(self,h,w):

self.height=h

self.weight=w

def BMI(self):

return self.weight/self.height/self.height

この例では、__init__ の中でheight(身長)とweight(体重)がインスタンス変数に保持されています。

この状態をオブジェクト単位でまとめられているといいます。

またBMIも同様にこのBMIを求めるメソッドはオブジェクトの状態を使ってBMIを求めています。

このように変数やメソッドを1つのブロックにまとめることを言います。

データを外部から直接アクセスできないようにして書き換えられないように隠蔽

データを外部から直接アクセスできないようにして書き換えられないようにするとはどういうことなのでしょう。

イメージしにくいですよね。ですので逆の発想でもし外部からもアクセスできるようになったらどうなるのかを考えてみましょう。

たとえば学校のテストの結果をパソコンの中に保存されているとしましょう。

tesuto=[60,75,30,80,90]

こんな感じでデータが保存されているとします。

しかしこのデータが外部の誰かが勝手に値を変更して

tesuto=[100,100,100,100,100]

とされてしまったとしたらこの子の成績は爆上がりです。

これがゲームなどであればバグが発生してしまいます。

他にもクラス外からのデータのアクセスによって不都合が起きることを防ぐことができます。

例えば採点してデータを入力した後に採点ミスが発覚して全員の点数に+5点することになったとします。

そのとき

tesuto=[50,80,100,55,40]

となっているもともと100点の科目に+5点することになるとこの人の点数が105点になってしまっておかしくなります。

このバグを防ぐために

MaxScore=100

としておくことでもし得点が100より大きかったら得点をMaxScoreにする。というプログラムを組めばエラーは出ません。

このようにオブジェクトの外からの変更も防ぐことで情報の隠ぺいをすることができエラーを吐くこともなくなるのです。

Javaのときにはこのように外部から変更されないようにprivateを使いますがPythonにはプライベート変数がありません。

その代わり触られたくないときには _ アンダースコアを使います。

これが付いたものを変更して動かなくなったら時には自己責任でというルールがあるそうです。

さらにアンダースコア2つの__にすると強制的にアクセスすることを制限できます。

これをつけて外部からのアクセスを禁止しましょう。

コメント

タイトルとURLをコピーしました