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