[Python] Héritage de classe (super)

Héritage de classe

Comme son nom l'indique, créez une classe dérivée qui a la fonction d'une classe de base.

Héritage d'une classe

Ici, les classes Guerrier et Magicien sont simplement créées sur la base de la classe Créature. La capacité est augmentée en fonction du niveau initial.

La fonction status (self) énumère les paramètres. (pour test) __init__ est exécuté au moment de l'instanciation. Dans les classes Worrior et Magician, nous avons des armes et changeons les noms de métier.

clas_test1.py


class Creature(object):
    def __init__(self, level=1, weapon=None):
        self.level = level
        self.hp = 0
        self.mp = 0
        self.attack = 0
        self.defence = 0
        self.weapon = weapon
        self.job = "neet"

    def status(self):
        return "Job:{} | HP:{} | MP:{} | Atk:{} | Def:{} | Weapon:{}".format \
                (self.job, self.hp, self.mp, self.attack, self.defence, self.weapon)


class Warrior(Creature):
    def __init__(self, level):
        super().__init__(level)
        self.attack += 3 * level
        if self.weapon is None:
            self.weapon = "sword"
        if self.job == "neet":
            self.job = "Warrior"
        else: self.job += "Warrior"


class Magician(Creature):
    def __init__(self, level):
        super().__init__(level)
        self.mp += 4 * level
        if self.weapon is None:
            self.weapon = "rod"
        if self.job == "neet":
            self.job = "Magic"
        else: self.job += "Magic"

Comme indiqué ci-dessous, vous pouvez utiliser la fonction d'état de la classe de base pour augmenter la capacité en fonction du niveau.

test1.py


>>> print(Warrior(5).status())
Job:Warrior | HP:0 | MP:0 | Atk:15 | Def:0 | Weapon:sword
>>> print(Magician(5).status())
Job:Magic | HP:0 | MP:20 | Atk:0 | Def:0 | Weapon:rod

Héritage de classes multiples

Dans le cas de plusieurs classes, la même chose qu'avant est presque la même.

class_test2.py


class MagicWarrior(Warrior, Magician):
    def __init__(self, level):
        super().__init__(level)


class WarriorMagic(Magician, Warrior):
    def __init__(self, level):
        super().__init__(level)

Ici, le point à noter est, comme vous pouvez le voir dans la sortie ci-dessous. Lorsque super () est utilisé, l'ordre dans lequel __init__ est appelé est de l'arrière. Cet ordre peut être confirmé avec mro ().

test2.py


>>> print(MagicWarrior(5).status())
Job:MagicWarrior | HP:0 | MP:20 | Atk:15 | Def:0 | Weapon:rod
>>> print(WarriorMagic(5).status())
Job:WarriorMagic | HP:0 | MP:20 | Atk:15 | Def:0 | Weapon:sword
>>>
>>> WarriorMagic.mro()
[<class 'class_test.WarriorMagic'>, <class 'class_test.Magician'>, <class 'class_test.Warrior'>, <class 'class_test.Creature'>, <class 'object'>]

Que se passe-t-il si vous n'utilisez pas super

Par exemple

class_test3.py


class WarriorMagic(Magician, Warrior):
    def __init__(self, level):
        # super().__init__(level)
        Warrior.__init__(self, level)
        Magician.__init__(self, level)

À première vue, cela a la même apparence, mais le nombre d'appels d'initialisation est différent. Dans ce cas, Guerrier> Créature, Magicien> Guerrier> Créature J'appelle ça comme ça.

Lors de l'utilisation de super, Magicien> Guerrier> Créature Et le nombre d'appels est différent.  Job:WarriorMagic | HP:0 | MP:20 | Atk:15 | Def:0 | Weapon:sword

De plus, si les classes de base Warrior et Magician sont également définies sans utiliser de super

class_test4.py


class Warrior(Creature):
    def __init__(self, level):
        # super().__init__(level)
        Creature.__init__(self, level)
        self.attack += 3 * level
        if self.weapon is None:
            self.weapon = "sword"
        if self.job == "neet":
            self.job = "Warrior"
        else: self.job += "Warrior"


class Magician(Creature):
    def __init__(self, level):
        # super().__init__(level)
        Creature.__init__(self, level)
        self.mp += 4 * level
        if self.weapon is None:
            self.weapon = "rod"
        if self.job == "neet":
            self.job = "Magic"
        else: self.job += "Magic"

test4.py


Job:Magic | HP:0 | MP:20 | Atk:0 | Def:0 | Weapon:rod

En faisant cela, même si j'ai acquis des capacités dans le premier guerrier, Depuis que le deuxième init a été appelé par Magician, les paramètres ont été initialisés et seule la capacité de Magician a été attribuée. En conséquence, ce sera comme ci-dessous.

Dans le flux, Warrior > Creature, Magician > Creature Comme vous pouvez le voir, Creature a été appelée deux fois, et contrairement à avant, Warrior n'a pas été appelé la deuxième fois, donc l'init de Worrior n'a pas été reflété. Je suis.

Résumé

Pour le moment, utilisez essentiellement super lors de l'héritage Lors de l'utilisation de super, il est appelé par derrière

Recommended Posts

[Python] Héritage de classe (super)
[Python] Héritage de classe, remplacement
[python] super (), héritage, __init__, etc.
Héritage de classe
Héritage de classe et super fonction
Python #inheritance (héritage)
[Hikari-Python] Chapitre 09-03 Classe (Héritage)
[Python] classe, instance
"Kanrika" la classe python
À propos de python, classe
À propos de l'héritage Python
classe python, instance
Les bases de #Python (classe)
classe wrapper python syslog
Classe Python (mémo d'apprentissage Python ⑦)
classe de cas en python
Essayez de résoudre le problème de l'héritage de classe Python
[Python] Débogage super utile
Tri par classe Python
[python] méthode de base de la classe
classe de wrapper de sous-processus python
Problème avec les variables pseudo-privées Python et l'héritage de classe
Pratique de l'héritage de classe en python comme vu dans sklearn
Classe wrapper YOLO Python
Notation de classe en Python
Liste des classes d'exception Python
mémorandum python super basique
Python: variables de classe et d'instance
python super débutant essaie de gratter
Un programmeur C / C ++ défie Python (édition de classe)
Structure super minuscule en Python
Résumé de la portée des membres de la classe Python
Variables de classe et d'instance Python
Python #function 2 pour les super débutants
Python #function 1 pour les super débutants
#List Python pour les super débutants
Python
Les mines terrestres cachées dans les variables de classe Python
Python pour les super débutants Super débutants Python # dictionnaire type 1
Définitions de classe Python et gestion des instances
"La classe d'introduction Python la plus simple" modifiée
J'ai examiné les remplacements d'héritage de classe.
Lire des morceaux PNG en Python (édition de classe)
classe
[Python] Road to the Serpent (3) Classe Python
Python #index pour les super débutants, tranches
Fonction Python #len pour les super débutants
Examiner la classe d'un objet avec python
objet perl et classe python partie 1.
[Python] Raison du remplacement à l'aide de super ()
Python #Hello World pour les super débutants
classe
Python pour les super débutants Super débutants Python # dictionnaire type 2
[Python] Hériter d'une classe avec des variables de classe
Comprendre les classes python Struggle (2) Work Ce n'est pas tout, non? _ À propos de l'héritage de classe
Générer une collection de première classe en Python
Créer un décorateur de fonction Python avec Class
[Python] Test super facile avec instruction assert
Implémenter __eq__ etc. de manière générique dans la classe Python