LoginSignup
0
2

PythonによるMinxinという考え方

Posted at

Minxin

Pyhonにおいて、多重継承に問題がいろいろあるため、
継承によるクラスの拡張を簡単にできるやり方がある

基底クラス

class Character():
    def __init__(self, HP, MP) -> None:
        self.HP = HP
        self.MP = MP

Mixinクラス

class CharacterMixin:
    def normal_attack(self, name):
        print(f'{name}が攻撃しました。')
        print(f'敵に{self.power}のダメージを与えました')

    def show_attack_power(self):
        print(f"攻撃力は{self.power}")

    def show_skill(self):
        print(f"持っている職業スキルは{self.skill}")

    def show_status(self):
        print(f'HP:{self.HP} MP:{self.MP} 攻撃力:{self.power} スキル:{self.skill}')

class MagicMixin:
    def io_attack(self, name):
        if self.skill["イオ"] == 1:
            print(f'{name}がイオを唱えました。')

    def mera_attack(self, name):
        if self.skill['メラ'] == 1:
            print(f'{name}がメラを唱えました。')

class WarriorMixin:
    def defence(self, name):
        print(f'{name}が敵の攻撃を受け流しました。')

職業クラス

class Wizard(Character, CharacterMixin, MagicMixin):
    def __init__(self, HP, MP, power, skill) -> None:
        super().__init__(HP, MP)
        self.power = power
        self.skill = skill

class Warrior(Character, CharacterMixin, WarriorMixin):
    def __init__(self, HP, MP, power, skill) -> None:
        super().__init__(HP, MP)
        self.power = power
        self.skill = skill

Playerクラス

class Player():
    def __init__(self, name, job) -> None:
        self.job = job
        self.name = name

実行

if __name__ == "__main__":

    # 職業クラス
    wizard = Wizard(HP=30, MP=30, power=10, skill={"メラ": 1, "イオ": 1})
    warrior = Warrior(HP=50, MP=0, power= 30, skill={"受け流し" : 1,"ためる": 1})

    # Playerクラス
    marin = Player(name="マリン", job=wizard)
    tuyoshi = Player(name='ツヨシ', job=warrior)

    # 名前の表示
    print("Player Name:", marin.name)
    # ステータスの表示
    marin.job.show_status()
    # できる攻撃
    marin.job.normal_attack(marin.name)
    marin.job.io_attack(marin.name)
    marin.job.mera_attack(marin.name)
    print('-------')
    tuyoshi.job.show_status()
    tuyoshi.job.normal_attack(tuyoshi.name)
    tuyoshi.job.defence(tuyoshi.name)

実行結果

Player Name: マリン
HP:30 MP:30 攻撃力:10 スキル:{'メラ': 1, 'イオ': 1}
マリンが攻撃しました。
敵に10のダメージを与えました
マリンがイオを唱えました。
マリンがメラを唱えました。
-------
HP:50 MP:0 攻撃力:30 スキル:{'受け流し': 1, 'ためる': 1}
ツヨシが攻撃しました。
敵に30のダメージを与えました
ツヨシが敵の攻撃を受け流しました。

感想

Mixinで多重継承ができて、拡張しやすいと感じています。
通常の多重継承だと順番を気にする必要があるが、
Mixinの場合、基底クラス、共通メソッドクラス、カスタムクラスという順番を決めておけば、
それなりに使えるかと思います。
但し、4,5以上はお勧めしません。

事例で示してるのは、職業クラスからPlayerクラスに至って、継承をやめており、
職業をPlayerクラスのプロパティにし、
jobクラスが持っているメソッドを活用して、実行するようにしている。
なお、拡張する場合は、メソッドを増やすことができ、
攻撃相手(enemyなどクラス)を引数として、引き渡せば、それなりに拡張できると思います。

以上。

0
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
2