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.
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 **
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.
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é!
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).
«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.
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