Pythonによるオブジェクト指向プログラミング
目次
- クラス定義
- オブジェクトとインスタンス化
- 属性とコンストラクタ
- 操作(メソッド)定義と呼び出し
- 参照型変数(オブジェクト変数)
- 継承
- オーバーライド
クラス定義
classを使って定義する- クラス名は慣例的に頭大文字
- 基本書式
class クラス名:
クラス定義の記述
- Pythonでは書き方に自由度があるが本講義では以下のような記述を行う
class クラス名: 属性1 = 初期値 属性2 = 初期値 ... def 操作1(引数1, ...): ...
- ドラクエっぽいゲームの例
class Yusha:
job = 'Yusha'
lv = 1
hp = 0
mp = 0
class Kenshi:
job = 'Kenshi'
lv = 1
hp = 0
mp = 0
class Slime:
job = 'Slime'
lv = 1
hp = 0
mp = 0
class Mimic:
job = 'Mimic'
lv = 1
hp = 0
mp = 0
インスタンス化と変数
- Pythonでは
クラス名()としてクラスからオブジェクトを生成する - オブジェクト属性へのアクセスには
.(ピリオド)を使う
class Yusha:
job = 'Yusha'
lv = 1
hp = 0
mp = 0
a = Yusha() # 「ゆうしゃ」のオブジェクトを作成して変数aに代入
# 変数aは「ある一人のゆうしゃ」を参照する変数
b = Yusha() # 変数bは別のゆうしゃを参照する変数
print(a.job) # 「ゆうしゃ」を表示
a.hp = 100 # hpを100に変更
print(a.hp) # 「100」を表示
print(b.hp) # 「0」を表示 <- aが参照するオブジェクトとbが参照するオブジェクトが違うため
b = a # aの参照をbへ代入.これにより変数aとbは同じオブジェクトを参照する
b.hp = 1000 # hpを1000に変更
print(b.hp) # 「1000」を表示
print(a.hp) # 「1000」を表示 <- aとbが同じオブジェクトを参照するため
操作(メソッド)
- そのオブジェクトに対する操作はclass内のブロックに
defで定義する - メソッドの第一引数は「自分自身のオブジェクト」が渡される
- 慣例として
selfと言う名前で受ける - そのため
self.xx自分の属性にアクセスできる
- 慣例として
- あるオブジェクトのメソッドの呼び出しには
.(ピリオド)を用いる
class Yusha:
job = 'Yusha'
lv = 1
hp = 0
mp = 0
def damage(self, x):
self.hp -= x
def heal(self, x):
self.hp += x
a = Yusha()
a.hp = 100 # hpを100に変更
print(a.hp) # 「100」を表示
a.damage(10) # self の部分の引数は無視をすることに注意
print(a.hp) # 「90」を表示
a.heal(11)
print(a.hp) # 「101」を表示
コンストラクタ
- Pythonではコンストラクタは
___init___と言う名前のメソッドで定義する - コンストラクタがある場合オブジェクト生成時(インスタンス化)に
クラス名(引数...)として__init__の中身を記載する - コンストラクタへの引数は
クラス名(引数...)として指定する
class Yusha:
job = 'Yusha'
lv = 1
hp = 0
mp = 0
def __init__(self, hp, mp):
self.hp = hp
self.mp = mp
a = Yusha(10, 20) # 初期HP:10, 初期MP:20でオブジェクトを作る
継承
- Pythonで継承を行うためにはクラス定義で
class クラス名(親クラス名): 処理...とする
- 親の属性,メソッドが子のオブジェクトでも使えるようになる
class Player:
job = None
lv = 1
hp = 0
mp = 0
def print_job(self):
print(self.job)
class Yusha(Player):
def __init__(self):
self.job = 'Yusha'
class Kenshi(Player):
def __init__(self):
self.job = 'Kenshi'
a = Yusha()
a.print_job()
print(a.hp)
b = Kenshi()
b.print_job()
print(b.hp)
オーバーライド
- 子クラスで親クラスの操作を再定義する
- 親クラスのメソッドを呼びたい場合は
super().メソッド名()
とする
class Player:
job = None
lv = 1
hp = 0
mp = 0
def print_job(self):
print(self.job)
class Yusha(Player):
def __init__(self):
self.job = 'Yusha'
def print_job(self):
super().print_job()
print('Yusha desu')
class Kenshi(Player):
def __init__(self):
self.job = 'Kenshi'
a = Yusha()
a.print_job()
print(a.hp)
b = Kenshi()
b.print_job()
print(b.hp)