#1.オブジェクト指向
pythonの基本や関数はわかっている前提での説明です。
##1-1.それ何?
オブジェクト指向とは、プログラムで実現したいことを「機能やデータを持った”モノ”」の集まりとして捉え、それらの関係性をプログラムを構築していく考え方です。
プログラムを書いたことがある方はわかると思いますが、現実世界で起こっていることをプログラムで書こうとすると全く異なる手順で物事を考えなければいけません。しかし、オブジェクト指向は現実世界に近いものの見方でプログラミングできるので、慣れると非常に便利です。
##例で見てみる
人がたくさん出てくる体重を増やすゲームを作るとしましょう。(謎なゲームですが。。。)
下記の例では三人の名前、体重があって、食べたら体重が1kg増えるというものです。
名前、体重、食べたら1キロ増えるという感じのことを記述してあります。
例1)普通の書き方
#名前
name_1="佐藤"
name_2="田中"
name_3="山本"
#体重
weight_1=70
weight_2=53
weight_3=66
#食べて太る
weight_1=weight_1+1
weight_2=weight_2+1
weight_3=weight_3+1
例2)オブジェクト指向
例1をオブジェクト指向で書くと下記のような感じになります。
sato=Human("佐藤",70)
tanaka=Human("田中",53)
yamamoto=Human("山本",66)
sato.eat()
tanaka.eat()
yamamoto.eat()
こっちの方がプログラムがわかりやすくないですか??
このように実現したい内容をモノとして捉えて、それを動かしていくとプログラムがシンプルになったり、再利用しやすくなったりします。
#2.オブジェクト指向の基本
##2-1.クラス
オブジェクト指向ではクラスという設計図を作っておいて、それを活用して進めていきます。この設計図のことをクラスと言います。
例2も簡単そうに書きましたが、実はその上に
下記のようなHumanクラスを作っておくことで、あのような簡潔な記述になっています。
まだ中の内容は理解する必要はありません。クラスは設計図ということを頭に入れておきましょう。
# クラスを定義ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
class Human:
def __init__(self,name,weight):
# コンストラクタ
self.name=name
self.weight=weight
def eat(self):
#eatメソッド
self.weight=self.weight+1
print(self.name,"さんは食事をしました。今の体重は",self.weight,"kgです。")
# ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
# インスタンス化ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
sato=Human("佐藤",70)
tanaka=Human("田中",53)
yamamoto=Human("山本",66)
# ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
#eatメソッドを実行ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
sato.eat()
tanaka.eat()
yamamoto.eat()
# ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
###2-1-1.Work1:コピペ&実行
2-1のプログラムをコピペして、実行してみましょう。
##2-2.メンバ変数とメソッド
クラスという設計図の中にはメンバ変数とメソッドを記述します。
###メンバ変数
メンバ変数は、簡単にいうとクラスの中の変数です。
他の言語ではフィールドと言ったり、プロパティと言ったりもします。
2-1のHumanクラスの中には名前と体重が必要ですので、
・name
・weight
という変数を作ってあります。
self.name
self.weigh
といった部分です。
【メンバ変数の注意点】
普通の変数の前に self. とつけるのがポイントですね。
###メソッド
メソッドは振る舞いと言われたりしますが、要するにクラスの中の関数です。
2-1のHumanクラスの中には、食べるという振る舞いが必要なので
・eat
というメソッドを作ってあります。
def eat(self):
#eatメソッド
self.weight=self.weight+1
print(self.name,"さんの今の体重は",self.weight,"kgです。")
の部分です。
【メソッドの注意点】
メソッドの第一引数は self となります。
##2-3クラスを実体化(インスタンス)
クラスは設計図でした。実際使うときはその設計図を使って実物を作らなければいけません。
実物のことをインスタンス(実体)、インスタンスを作ることをインスタンス化と言います。
ゲームで言うと何かのキャラを召喚するようなイメージですね。
2-1の
sato=Human("佐藤",70)
tanaka=Human("田中",53)
yamamoto=Human("山本",66)
の部分はHumanという設計図をもとに
・70kgの佐藤さん
・53kgの田中さん
・66kgの山本さん
というインスタンスを作っています。
##2-4.コンストラクタ
クラスを実体化(インスタンス化)する際に、設定等で最初に実行されるメソッドのことです。
クラスの中の
def __init__()
というメソッドがコンストラクタになります。メソッドの名前は決まっているので、自分では変えられません。
2-1では
def __init__(self,name,weight):
# コンストラクタ
self.name=name
self.weight=weight
の部分ですね。コンストラクタはメソッドなので第一引数はselfになりますが、第2引数以降は自分で設計できます。
コンストラクタで引数として受け取った
name、weightを
メンバ変数にself.name、self.weightに代入することで
そのインスタンス化される際に
名前
体重
が決まるわけです。
【コンストラクタの注意点】
・コンストラクタの名前は変えられない
・第一引数はself
・第2引数以降は自分で設定できる
#work2:例をいじくり回してみる
2-1のプログラムをいろいろ変更してみましょう。
例えば
・インスタンスを増やしてみる
・メソッドの内容を変えてみる(1kg増ではなく、2kg増など)
・メソッドに引数を増やして、食べる量によって体重増加を増やしてみる
・コンストラクタの引数に身長を追加し、身長、BMIのメンバ変数を準備し、食べたらBMIも表示するようにする
など
#work3:メソッドを増やしてみましょう。
下記はwalkメソッドを追加して、歩いた距離によって体重を減らす実行しています。こんな感じで、Humanクラスにメソッドを追加してみましょう。
# クラスーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
class Human:
def __init__(self,name,weight):
# コンストラクタ
self.name=name
self.weight=weight
def eat(self):
#eatメソッド
self.weight=self.weight+1
print(self.name,"さんは食事をしました。今の体重は",self.weight,"kgです。")
def walk(self,distance_km):
self.weight=self.weight-distance_km*0.1
print(self.name, "さんは",distance_km,"km歩いたことにより体重が", self.weight, "kgになりました。")
# ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
# インスタンス化ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
sato=Human("佐藤",70)
tanaka=Human("田中",53)
yamamoto=Human("山本",66)
# ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
#eatメソッドを実行ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
sato.eat()
tanaka.eat()
yamamoto.eat()
# ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
#walkメソッドを実行ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
sato.walk(7)
tanaka.walk(1)
yamamoto.walk(2)
# ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー