クラス - Python3

クラスの設計・使い方

クラス名の最初は大文字にします。クラスのメソッドを定義するときには、第一引数に「 self 」を指定します。

class Greeting:
  def hello(self, name):
    print("hello, {0}.".format(name))

g = Greeting()

g.hello("taro")

クラス内で利用するデータを「 初期化メソッド 」を使って準備します。インスタンスの初期化メソッドのことを「 コンストラクタ 」といいます。

import math

class TaxCalc:
  def __init__(self):
    self.tax_rate = 1.08
    self.total = 0
  
  def addItem(self, price):
    self.total += price

  def calc(self):
    return math.ceil(self.total * self.tax_rate)

cart1 = TaxCalc()
cart1.addItem(500)
print(cart1.calc(), "円")


cart2 = TaxCalc()
cart2.addItem(100)
cart2.addItem(200)
print(cart2.calc(), "円")

継承

継承とは、すでに定義しているクラスをもとに、新たな要素を加えたクラスを定義することです。

もとになるクラスを「 スーパークラス(基底クラス)」といい、新たに定義されたクラスを「 サブクラス(派生クラス)」といいます。

class SaiyazinVegeta():
  def __init__(self):
    self.fight_ability = 100
    self.galick_damage = 10

  def galickgun(self):
    print("ギャリック砲ダメージ:{0}".format(self.galick_damage))

class SuperSaiyazinVegeta(SaiyazinVegeta):
  def __init__(self):
    super().__init__()
    self.fight_ability = 200
    self.galick_damage = 20
    self.big_damage = 40

  def bigbangattack(self):
    print("ビッグバンアタックダメージ:{0}".format(self.big_damage))

vegeta = SaiyazinVegeta()
print("ベジータの能力値:" + str(vegeta.fight_ability))
vegeta.galickgun() # ギャリック砲ダメージ:10

svegeta = SuperSaiyazinVegeta()
print("スーパーサイヤ人 ベジータの能力値:" + str(vegeta.fight_ability))
svegeta.galickgun() # ギャリック砲ダメージ:20
svegeta.bigbangattack() # ビッグバンアタックダメージ:40

メソッドのオーバーライド

スーパークラスとサブクラスの両方で同じメソッドが定義されていると、サブクラスのメソッドで上書きされることを「 メソッドのオーバーライド 」といいます。

オーバーライドしつつ、サブクラスからスーパークラスのメソッドを呼び出す場合は、super()をつけて呼び出します。

class SaiyazinGoku():
  def kamehameha(self):
    print("かめはめ波ダメージ:10")


class SuperSaiyazinGoku(SaiyazinGoku):
  def kamehameha(self):
    print("かめはめ波ダメージ:20")
    
  def base_kame(self):
    super().kamehameha()

goku = SaiyazinGoku()
goku.kamehameha() # かめはめ波ダメージ:10

sgoku = SuperSaiyazinGoku()
sgoku.kamehameha() # かめはめ波ダメージ:20
sgoku.base_kame() # かめはめ波ダメージ:10

多重継承

複数のクラスをスーパークラスに指定することができます。

class Goku():
  def __init__(self):
    self.kame_damage = 10

  def kamehameha(self):
    print("かめはめ波:{0}のダメージを与えた".format(self.kame_damage))

class Vegeta():
  def __init__(self):
    self.big_damage = 10

  def bigbangattack(self):
    print("ビッグバンアタック:{0}のダメージを与えた".format(self.big_damage))

class Gogeta(Goku, Vegeta):
  def __init__(self):
    super(Gogeta, self).__init__()
    super(Goku, self).__init__()

  def bigkame(self):
    print("ビッグバンかめはめ波:20のダメージを与えた")

goku = Goku()
goku.kamehameha() # かめはめ波:10のダメージを与えた
vegeta = Vegeta()
vegeta.bigbangattack() # ビッグバンアタック:10のダメージを与えた
gogeta = Gogeta()
gogeta.kamehameha() # かめはめ波:10のダメージを与えた
gogeta.bigbangattack() # ビッグバンアタック:10のダメージを与えた
gogeta.bigkame() # ビッグバンかめはめ波:20のダメージを与えた