目次

  • クラス定義
  • オブジェクトとインスタンス化
  • 属性とコンストラクタ
  • 操作(メソッド)定義と呼び出し
  • 参照型変数(オブジェクト変数)
  • 継承
  • オーバーライド

クラス定義

  • 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)