プログラ生活

プログラム初学者のためのポイントを書いていこうと思います。たまに脇道それた記事もありますが、息抜きだとおもって気長にお付き合いください。

【Python連載】クラス (オーバーライド)-024-

www.pon-x.jp

今回は前回までの続き、クラスの続きです。

オーバーライド

今回は、親クラスの一部を上書きするオーバーライドを紹介します。

まずは、前回までのストーリーにもとづいて以下のクラスを作ってみましょう。

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("-------------------------")

f:id:hanabusa-snow:20211209084244p:plain

このように実行されました。

以下、全コードです。

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("-------------------------")