クラス - Python

  • 作成日:
  • 最終更新日:2025/10/11

クラスの設計・使い方

クラス名の最初は大文字にします。クラスのメソッドを定義するときには、第一引数に「 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のダメージを与えた