ドラクエの職業でPythonのクラスの継承を解説!
Pythonのクラスの継承って何かよく分からない?一体どんなものか?
普通に説明してもなかなかイメージしにくいと思いますのでこれをドラクエの職業で説明します。
【結論】
クラスの継承は指定した既存のクラスから追加や変更を定義し新しいクラスを作ります。
【理由】
ドラクエにはまず何も職業についてない
人間があります。
その人間にはHP、MP、攻撃、防御などがあります。
それが転職で戦士になったとしましょう。
戦士になってもHP、MP、攻撃、防御は受け継がれます。
これがクラスの継承です。人間が親クラスで戦士が子クラスです。
さらに人間がMPが50だとして転職で魔法使いになったからMPを100にする。
こうすると子クラスのMP100が親クラスに上書きされます。
MP100となります。
【具体例】
実際にコードで見ていきましょう。
・1
class HumanClass: #基底クラス
def defend(self):
print('防御しました')
class WizardClass(HumanClass):
pass
wizard = WizardClass()
wizard.defend()
> 防御しました
HumanClassが基底クラスでありそれをselfにHumanClassをインスタンス変数として、wizardをWizardClass()に代入してHumanClassの防御しましたをwizardに継承したので防御しましたと表示されます。
・2
class HumanClass: #基底クラス
def __init__ (self):
print('HumanClassのinit')
self.hp = 100
class WizardClass(HumanClass):
pass
wizard = WizardClass()
print(wizard.hp)
>100
"__init__"はインスタンス変数を実体化をさせます。実体化させた100をhpに入れてprint(wizard.hp)に継承して100と表示されます。
・3
class HumanClass: #基底クラス
def __init__ (self):
print('HumanClassのinit')
self.hp = 100
class WizardClass(HumanClass):
def __init__ (self):
super().__init__()
self.mp = 50
wizard = WizardClass()
print(wizard.mp)
> HumanClassのinit
50
def __init__ (self):はHumanClassをインスタンス化してhp = 100となりそれをWizardClassが継承します。
それをsuper().__init__()の処理で値を上書き
これにより100が50になります。
・4
wizard = WizardClass()
print(wizard.mp)
class HumanClass: #基底クラス
def __init__ (self):
print('HumanClassのinit')
self.hp = 100
class WizardClass(HumanClass):
def __init__ (self):
super().__init__()
self.mp = 50
def output_info (self):
print(f'現在のhpは{self.hp}で'
f'mpは{self.mp}です')
wizard = WizardClass()
wizard.output_info()
HumanClassのhp100を継承しさらにWizardClassのmp50をsuper()で上書きします。
info()はデータを得ることができる処理です。
そのデータをprint(f'現在のhpは{self.hp}で'
f'mpは{self.mp}です')に入れて
現在のhpは100でmpは50ですと出ます。
【結論】
クラスの継承はなかなか感覚掴むのは大変ですからドラクエの職業のデータでイメージすると分かりやすいです。
特にsuper().__init__()の上書きやinfoのデータ取得は良く使うので身につけておきましょう。
取材やお仕事紹介などはこちらからお気軽にご連絡下さい。
ysa7825@gmail.com