今回は前回までの続き、クラスの続きです。
オーバーライド
今回は、親クラスの一部を上書きするオーバーライドを紹介します。
まずは、前回までのストーリーにもとづいて以下のクラスを作ってみましょう。
class Character: def __init__ (self, job, HP, weapon):# コンストラクタを定義して、初期値を決める。 self.job = job self.HP = HP self.level = 1 self.comment = self.job + "が誕生した" def set_status(self, set_HP): # レベルとHPを上げるメソッドに変更 self.level += 1 # レベルを1ずつ上げる(1ずつと分かっているので引数はいらない) self.HP += set_HP # さっきまでは直接代入したが、増加分に変更する self.comment = self.job + "はレベルが上がった" def print_status(self): #表示するためのメソッド print("職業 : " + self.job) print("H P : " + str(self.HP)) print("武器 : " + self.weapon) print("レベル : " + str(self.level)) print("※ " + self.comment) def powerUp(self): self.HP += 50 self.comment = "勇者のレベルが上がった"
そして、前回同様にCharacterクラスを継承するChildクラスを作成します。
class Child(Character): def __init__(self, job, HP, weapon, comment): super().__init__(job, HP,weapon) self.weapon = weapon self.comment = comment def powerUp(self): self.HP += 100 self.comment = "孫勇者のレベルが上がった"
2つのクラスを比較するとお互いpowerUpメソッドが存在していることがわかります。
Characterクラスは通常通りpowerUpメソッドが使用できますが、ChildメソッドはCharacterクラスを継承していますが、powerUpメソッドを実行するとChildクラス内のpowerUpメソッドがCharacterクラスのpowerUpメソッドを上書きして実行されます。
これがオーバーライドです。
以下を実行してみましょう。
print("-------------------------") yusya = Child("勇者" , 50 , "ほっそい棒" , "勇者がうまれた") yusya.print_status() print(">>>>>>>>>>>>>>>>>>>>>>>>>") child_yusya = Child("孫勇者" , 100 , "はがねの剣" , "孫勇者がうまれた") child_yusya.print_status() print("-------------------------") print("-------------------------") yusya.powerUp() yusya.print_status() print(">>>>>>>>>>>>>>>>>>>>>>>>>") child_yusya.powerUp() child_yusya.print_status() print("-------------------------")
このように実行されました。
以下、全コードです。
class Character: def __init__ (self, job, HP, weapon):# コンストラクタを定義して、初期値を決める。 self.job = job self.HP = HP self.level = 1 self.comment = self.job + "が誕生した" def set_status(self, set_HP): # レベルとHPを上げるメソッドに変更 self.level += 1 # レベルを1ずつ上げる(1ずつと分かっているので引数はいらない) self.HP += set_HP # さっきまでは直接代入したが、増加分に変更する self.comment = self.job + "はレベルが上がった" def print_status(self): #表示するためのメソッド print("職業 : " + self.job) print("H P : " + str(self.HP)) print("武器 : " + self.weapon) print("レベル : " + str(self.level)) print("※ " + self.comment) def powerUp(self): self.HP += 50 self.comment = "勇者のレベルが上がった" class Child(Character): def __init__(self, job, HP, weapon, comment): super().__init__(job, HP,weapon) self.weapon = weapon self.comment = comment def powerUp(self): self.HP += 100 self.comment = "孫勇者のレベルが上がった" print("-------------------------") yusya = Child("勇者" , 50 , "ほっそい棒" , "勇者がうまれた") yusya.print_status() print(">>>>>>>>>>>>>>>>>>>>>>>>>") child_yusya = Child("孫勇者" , 100 , "はがねの剣" , "孫勇者がうまれた") child_yusya.print_status() print("-------------------------") print("-------------------------") yusya.powerUp() yusya.print_status() print(">>>>>>>>>>>>>>>>>>>>>>>>>") child_yusya.powerUp() child_yusya.print_status() print("-------------------------")