[Python] Programmation orientée objet apprise avec Pokemon

Récemment, Pokemon Sword Shield a été publié et est très populaire.

Alors, profitant de cette popularité Pokemon, je vais vous expliquer la programmation orientée objet à l'aide de Pokemon.

Qu'est-ce que la programmation orientée objet?

La traduction littérale d'un objet est «chose». En d'autres termes, nous essayons de programmer comme faire des choses.

Les objets doivent avoir des caractéristiques, des parties et un comportement. ** Le type de chose est appelé "classe", chaque chose est appelée "instance", et le comportement de chose est appelé "méthode" **.

Par exemple, considérez le Pokemon Lizardon. Lizardon a des statuts tels que le nom, le niveau, les HP et l'attaque.

Il existe des lizardons (instances) avec différents noms tels que "Rizasuke" et "Rizamaru" dans la race (classe) appelée lizardon.

En outre, l'une des techniques que Lizardon apprend est le rayonnement de la flamme. Telle est la méthode.

Le code pour ceux-ci est le suivant.

#Classe Lizardon
class Charizard(object):
    #La partie qui bouge lorsque vous créez une instance(Soi-disant réglage initial)
    def __init__(self,name,level,hp,attack,defence,sp_attack,sp_defence,speed):
        self.name = name
    #Vous pouvez faire plus que simplement définir des valeurs
        print('Aller!{}!'.format(self.name))
        self.level = level
        self.type1 = 'Hono'
        self.type2 = 'vol'
        self.hp = hp
        self.attack = attack
        self.defence = defence
        self.sp_attack = sp_attack
        self.sp_defence = sp_defence
        self.speed = speed
        
    #Rayonnement de la flamme(Méthode)
    def flame_radiation(self,enemy):
        #Correction de compatibilité
        compatibility_coefficient = 1
        for Type in [enemy.type1,enemy.type2]:
            if Type == 'Kusa'or'insecte'or'Koori'or'Hagane':
                compatibility_coefficient *= 2
                
    #Calcul des dommages(Vous n'avez pas besoin de connaître cette expression lors de l'utilisation de la méthode(Encapsulation))
        damage = ((self.level*2/5+2)*(90*self.sp_attack/enemy.sp_defence)/50+2)*compatibility_coefficient

        print('{}Rayonnement de la flamme!'.format(self.name))
        print('{}Est{}À{}Endommagé!'.format(self.name,enemy.name,np.round(damage)))
        if compatibility_coefficient >= 2:
            print('Celui-ci est excellent! !!')

#Ceci est une instance
rizasuke = Charizard('Rizasuke',100,297,183,192,317,206,328)
#C'est aussi une instance
rizamaru = Charizard('Rizamaru',50,200,100,100,150,100,150)

Une fois la classe chargée, elle peut être facilement exécutée avec seulement quelques lignes de code.

Au fait, concernant la méthode, il est intéressant qu'elle puisse être exécutée même si elle cible une autre classe.

Créons une classe Fushigibana comme essai et exécutons la méthode de rayonnement de flamme sur la classe Fushigibana.

class Fushigibana(object):
    def __init__(self,name,level,hp,attack,defence,sp_attack,sp_defence,speed):
        self.name = name
        print('Aller!{}!'.format(self.name))
        self.level = level
        self.type1 = 'Kusa'
        self.type2 = 'Doku'
        self.hp = hp
        self.attack = attack
        self.defence = defence
        self.sp_attack = sp_attack
        self.sp_defence = sp_defence
        self.speed = speed

rizasuke = Charizard('Rizasuke',100,297,183,192,317,206,328)
fussi = Fushigibana('Fusshi',100,364,180,202,328,236,196)
rizasuke.flame_radiation(fussi)

##Résultat d'exécution
#Aller! Rizasuke!
#Aller! Fusshi!
#Le rayonnement de la flamme de Rizasuke!
#Rizasuke a 414 ans.Infligé 0 dégât!
#Celui-ci est excellent! !!

Il existe trois caractéristiques principales de la programmation orientée objet:

** · Encapsulation ** ** ・ Héritage ** ** ・ Polymorphisme **

Encapsulation (masquage d'informations)

Il y avait une formule de calcul des dommages dans la méthode de rayonnement de flamme plus tôt. C'est une expression qui a l'air compliquée.

Cependant, lorsque vous exécutez réellement la méthode, vous pouvez facilement l'exécuter en écrivant `` rizasuke.flame_radiation (fussi) ''. Vous n'avez pas besoin de connaître la formule des dommages.

Dans un exemple général, la fonction print () est la même. C'est une fonction qui peut être facilement sortie, mais seules quelques personnes savent ce qu'elle fait.

Ce type de ** masquage des informations et de traitement à l'intérieur d'une classe ** est appelé encapsulation. L'encapsulation empêche la réécriture des informations internes et facilite la compréhension des classes et des méthodes.

De plus, les informations telles que le statut sont écrites ensemble dans une seule classe, ce qui facilite la gestion.

Héritage

La programmation orientée objet est très pratique simplement en résumant les fonctionnalités et les actions comme le code ci-dessus, mais on dit maintenant qu'il existe 890 types de Pokémon (de wikipedia). Ecrire chaque méthode de Pokemon à partir de zéro est fastidieux.

C'est là que «l'héritage» (remplacement) est utile. Tout ce que vous avez à faire est de mettre la classe parente dans l'argument de la petite classe puis de mettre la `` méthode super (). '' Dont vous voulez hériter.

Ici, la classe Pokemon est configurée pour partager le statut tel que HP et attaque, et la technique telle que le rayonnement de flamme.

En implémentant une nouvelle classe Pokemon (classe parent) comme indiqué dans le code ci-dessous et en l'héritant à des classes enfants telles que Lizardon et Kairyu, il n'est pas nécessaire d'écrire le code pour le statut et la technique deux fois. Avec cela, il semble que 890 types de Pokémon puissent être implémentés sans difficulté.

#Classe parent
class Pokemon(object):
    def __init__(self,name,level,hp,attack,defence,sp_attack,sp_defence,speed):
        self.name = name
        print('Aller!{}!'.format(self.name))
        self.level = level
        self.type1 = None
        self.type2 = None
        self.hp = hp
        self.attack = attack
        self.defence = defence
        self.sp_attack = sp_attack
        self.sp_defence = sp_defence
        self.speed = speed
        
    #Rayonnement de la flamme
    def flame_radiation(self,enemy):
        #Correction de compatibilité
        compatibility_coefficient = 1
        for Type in [enemy.type1,enemy.type2]:
            if Type == 'Kusa'or'insecte'or'Koori'or'Hagane':
                compatibility_coefficient *= 2
                
        damage = ((self.level*2/5+2)*(90*self.sp_attack/enemy.sp_defence)/50+2)*compatibility_coefficient
        print('{}Rayonnement de la flamme!'.format(self.name))
        print('{}Est{}À{}Endommagé!'.format(self.name,enemy.name,np.round(damage)))
        if compatibility_coefficient >= 2:
            print('Celui-ci est excellent! !!')

#Lizardon(Classe enfant)
class Charizard(Pokemon):
    def __init__(self,name,level,hp,attack,defence,sp_attack,sp_defence,speed):
        super().__init__(name,level,hp,attack,defence,sp_attack,sp_defence,speed)
        self.type1 = 'Hono'
        self.type2 = 'vol'
        
    def flame_radiation(self,enemy):
        super().flame_radiation(enemy)

#Kairyu(Classe enfant) 
class Cairyu(Pokemon):
    def __init__(self,name,level,hp,attack,defence,sp_attack,sp_defence,speed):
        super().__init__(name,level,hp,attack,defence,sp_attack,sp_defence,speed)
        self.type1 = 'Dragon'
        self.type2 = 'vol'
        
    def flame_radiation(self,enemy):
        super().flame_radiation(enemy)
        #Caractéristiques uniquement attachées au rayonnement de flamme de Kairyu(Propriétés provisoires pour expliquer le polymorphisme)
        print('L'autre partie s'est brûlé!')
        
rizasuke = Charizard('Rizasuke',100,297,183,192,317,206,328)
ryu_kun = Cairyu('Ryu-kun',100,323,403,226,212,299,196)
rizasuke.flame_radiation(ryu_kun)
ryu_kun.flame_radiation(rizasuke)

##Résultat d'exécution
#Aller! Rizasuke!
#Aller! Ryu-kun!
#Le rayonnement de la flamme de Rizasuke!
#Rizasuke Haryu-kun 329.Infligé 0 dégât!
#Le rayonnement de la flamme de Ryu-kun!
#Ryu-kun Harizasuke ni 319.Infligé 0 dégât!
#L'autre partie s'est brûlé!

Polymorphisme

Le polymorphisme est littéralement appelé polymorphisme, polymorphisme et diversité. Je pense que la diversité est la plus familière.

Une caractéristique majeure est que lorsqu'elle est utilisée en combinaison avec l'héritage, ** la même commande peut produire des résultats différents (différents résultats) **.

Jetez à nouveau un œil au code donné dans l'exemple d'héritage. Dans la méthode de rayonnement de flamme de Kairyu, en plus de super (). Flame_radiation (ennemi) '', print ('l'autre partie s'est brûlé!' ') `` Est inclus. Il n'est pas inclus dans la méthode d'émission de flamme de Lizardon.

En faisant cela, le rayonnement de flamme de Lizardon ne sera pas brûlé, et le rayonnement de flamme de Kairyu sera toujours brûlé (le Pokémon réel n'est pas une telle spécification).

Résumé

«La programmation orientée objet apprise de Pokemon» elle-même est une seconde infusion, mais rien n'explique les trois éléments majeurs de la programmation orientée objet tels que l'encapsulation et l'héritage. J'espère que cela pourra être bien communiqué.

Cependant, il est plus familier que l'apprentissage, et cela approfondira certainement votre compréhension si vous l'écrivez réellement, et vous comprendrez progressivement les mérites de la programmation orientée objet.

Si vous êtes un débutant, n'ayez pas peur de la programmation orientée objet et essayez de l'écrire vous-même.

Les références

Je ne comprends pas l'orientation des objets! Exercices préparatoires pour transformer votre miso cérébral en cerveau objet [Python] Concept et écriture de la programmation orientée objet

Recommended Posts

[Python] Programmation orientée objet apprise avec Pokemon
3. 3. Programmation IA avec Python
Programmation Python avec Atom
Programmation compétitive avec python
Programmation avec Python Flask
Programmation avec Python et Tkinter
L'apprentissage automatique appris avec Pokemon
Programmation réseau avec Python Scapy
[Swift / Ruby / Python / Java] Programmation orientée objet
Programmation facile Python + OpenCV avec Canopy
Expérience d'apprentissage Perceptron apprise avec Python
Structure de données Python apprise avec la chimioinfomatique
Ramassage efficace du réseau avec Python
1. Statistiques apprises avec Python 1-1. Statistiques de base (Pandas)
[Python] Extensions réactives apprises avec RxPY (3.0.1) [Rx]
Programmation de compétition avec les paramètres de l'environnement local python
1. Statistiques apprises avec Python 1-3. Calcul de diverses statistiques (statistiques)
FizzBuzz en Python3
Note de programmation Python
Grattage avec Python
Statistiques avec python
Grattage avec Python
Python avec Go
Twilio avec Python
Intégrer avec Python
Jouez avec 2016-Python
AES256 avec python
Testé avec Python
Programmation avec Python
python commence par ()
avec syntaxe (Python)
Bingo avec python
Zundokokiyoshi avec python
Excel avec Python
Micro-ordinateur avec Python
Cast avec python
Comment profiter de la programmation avec Minecraft (Ruby, Python)
Qu'est-ce que la «programmation fonctionnelle» et «orientée objet»? Édition Python
Optimisation apprise avec OR-Tools [Planification linéaire: modèle en plusieurs étapes]
1. Statistiques apprises avec Python 1-2. Calcul de diverses statistiques (Numpy)
Utiliser Python et word2vec (appris) avec Azure Databricks
1. Statistiques apprises avec Python 2-1. Distribution de probabilité [variable discrète]
Optimisation apprise avec OR-Tools [Planification linéaire: gestion de projet]