[Python] Mit Pokemon erlernte objektorientierte Programmierung

Vor kurzem wurde Pokemon Sword Shield veröffentlicht und ist sehr beliebt.

Unter Ausnutzung dieser Pokemon-Popularität werde ich die objektorientierte Programmierung mit Pokemon erklären.

Was ist objektorientierte Programmierung?

Die wörtliche Übersetzung eines Objekts ist "Ding". Mit anderen Worten, wir versuchen zu programmieren, wie man Dinge macht.

Dinge sollten Merkmale, Teile und Verhalten haben. ** Die Art der Sache heißt "Klasse", jede Sache heißt "Instanz" und das Verhalten der Sache heißt "Methode" **.

Betrachten Sie zum Beispiel die Pokemon-Eidechse. Lizardon hat Status wie Name, Level, HP und Angriff.

Es gibt Eidechsen (Instanzen) mit verschiedenen Namen wie "Rizasuke" und "Rizamaru" in der Rasse (Klasse) namens Eidechse.

Eine der Techniken, die Lizardon lernt, ist die Flammenstrahlung. Dies ist die Methode.

Der Code für diese lautet wie folgt.

#Eidechsenklasse
class Charizard(object):
    #Der Teil, der sich beim Erstellen einer Instanz bewegt(Sogenannte Grundeinstellung)
    def __init__(self,name,level,hp,attack,defence,sp_attack,sp_defence,speed):
        self.name = name
    #Sie können mehr als nur Werte definieren
        print('Gehen!{}!'.format(self.name))
        self.level = level
        self.type1 = 'Hono'
        self.type2 = 'Flug'
        self.hp = hp
        self.attack = attack
        self.defence = defence
        self.sp_attack = sp_attack
        self.sp_defence = sp_defence
        self.speed = speed
        
    #Flammenstrahlung(Methode)
    def flame_radiation(self,enemy):
        #Kompatibilitätskorrektur
        compatibility_coefficient = 1
        for Type in [enemy.type1,enemy.type2]:
            if Type == 'Kusa'or'Insekt'or'Koori'or'Hagane':
                compatibility_coefficient *= 2
                
    #Schadensberechnung(Sie müssen diesen Ausdruck nicht kennen, wenn Sie die Methode verwenden(Verkapselung))
        damage = ((self.level*2/5+2)*(90*self.sp_attack/enemy.sp_defence)/50+2)*compatibility_coefficient

        print('{}Flammenstrahlung!'.format(self.name))
        print('{}Ist{}Zu{}Beschädigt!'.format(self.name,enemy.name,np.round(damage)))
        if compatibility_coefficient >= 2:
            print('Das hier ist ausgezeichnet! !!')

#Dies ist eine Instanz
rizasuke = Charizard('Rizasuke',100,297,183,192,317,206,328)
#Dies ist auch eine Instanz
rizamaru = Charizard('Rizamaru',50,200,100,100,150,100,150)

Sobald die Klasse geladen ist, kann sie problemlos mit nur wenigen Codezeilen ausgeführt werden.

Übrigens ist es in Bezug auf die Methode interessant, dass sie auch dann ausgeführt werden kann, wenn sie auf eine andere Klasse abzielt.

Lassen Sie uns eine Fushigibana-Klasse als Test erstellen und die Flammenstrahlungsmethode für die Fushigibana-Klasse ausführen.

class Fushigibana(object):
    def __init__(self,name,level,hp,attack,defence,sp_attack,sp_defence,speed):
        self.name = name
        print('Gehen!{}!'.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)

##Ausführungsergebnis
#Gehen! Rizasuke!
#Gehen! Fusshi!
#Rizasukes Flammenstrahlung!
#Rizasuke ist 414.Verursacht 0 Schaden!
#Das hier ist ausgezeichnet! !!

Es gibt drei Hauptmerkmale der objektorientierten Programmierung:

·Verkapselung ** ・ Vererbung ** ** ・ Polymorphismus **

Kapselung (Verstecken von Informationen)

Bei der Flammenstrahlungsmethode gab es früher eine Schadensberechnungsformel. Es ist ein Ausdruck, der kompliziert aussieht.

Wenn Sie die Methode jedoch tatsächlich ausführen, können Sie sie einfach ausführen, indem Sie `rizasuke.flame_radiation (fussi)` schreiben. Sie müssen die Schadensformel nicht kennen.

In einem allgemeinen Beispiel ist die Funktion print () dieselbe. Es ist eine Funktion, die leicht ausgegeben werden kann, aber nur wenige Leute wissen, was sie tut.

Diese Art des ** Versteckens von Informationen und der Verarbeitung innerhalb einer Klasse ** wird als Kapselung bezeichnet. Die Kapselung verhindert, dass interne Informationen neu geschrieben werden, und erleichtert das Verständnis von Klassen und Methoden.

Darüber hinaus werden Informationen wie der Status in einer Klasse zusammengefasst, was die Verwaltung erleichtert.

Erbe

Objektorientierte Programmierung ist sehr praktisch, wenn nur Funktionen und Verhaltensweisen wie der obige Code zusammengefasst werden. Es wird jedoch gesagt, dass es 890 Pokemon-Typen gibt (aus Wikipedia). Es ist mühsam, jede Pokemon-Methode von Grund auf neu zu schreiben.

Hier bietet sich "Vererbung" (Override) an. Alles, was Sie tun müssen, ist, die übergeordnete Klasse in das Argument der kleinen Klasse einzufügen und dann die `` super (). Methode `einzufügen, die Sie erben möchten.

Hier ist die Pokemon-Klasse so eingestellt, dass sie den Status wie HP und Angriff sowie die Technik wie Flammenstrahlung teilt.

Durch die Implementierung einer neuen Pokemon-Klasse (übergeordnete Klasse) wie den folgenden Code und deren Vererbung an untergeordnete Klassen wie Lizardon und Kairyu ist es nicht erforderlich, den Code für Status und Technik zweimal zu schreiben. Damit scheinen 890 Arten von Pokémon problemlos implementiert werden zu können.

#Übergeordnete Klasse
class Pokemon(object):
    def __init__(self,name,level,hp,attack,defence,sp_attack,sp_defence,speed):
        self.name = name
        print('Gehen!{}!'.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
        
    #Flammenstrahlung
    def flame_radiation(self,enemy):
        #Kompatibilitätskorrektur
        compatibility_coefficient = 1
        for Type in [enemy.type1,enemy.type2]:
            if Type == 'Kusa'or'Insekt'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('{}Flammenstrahlung!'.format(self.name))
        print('{}Ist{}Zu{}Beschädigt!'.format(self.name,enemy.name,np.round(damage)))
        if compatibility_coefficient >= 2:
            print('Das hier ist ausgezeichnet! !!')

#Eidechse(Kinderklasse)
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 = 'Flug'
        
    def flame_radiation(self,enemy):
        super().flame_radiation(enemy)

#Kairyu(Kinderklasse) 
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 = 'Drachen'
        self.type2 = 'Flug'
        
    def flame_radiation(self,enemy):
        super().flame_radiation(enemy)
        #Eigenschaften, die nur mit der Flammenstrahlung von Kairyu verbunden sind(Vorläufige Eigenschaften zur Erklärung des Polymorphismus)
        print('Die andere Partei wurde verbrannt!')
        
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)

##Ausführungsergebnis
#Gehen! Rizasuke!
#Gehen! Ryu-Kun!
#Rizasukes Flammenstrahlung!
#Rizasuke Haryu-kun 329.Verursacht 0 Schaden!
#Ryu-kuns Flammenstrahlung!
#Ryu-kun Harizasuke ni 319.Verursacht 0 Schaden!
#Die andere Partei wurde verbrannt!

Polymorphismus

Polymorphismus wird wörtlich Polymorphismus, Polymorphismus und Diversität genannt. Ich denke, Vielfalt ist am bekanntesten.

Ein Hauptmerkmal ist, dass in Kombination mit der Vererbung ** derselbe Befehl unterschiedliche Ergebnisse (verschiedene Ergebnisse) ** erzeugen kann.

Schauen Sie sich den Code im Vererbungsbeispiel noch einmal an. In Kairyus Flammenstrahlungsmethode wird zusätzlich zu "super (). Flame_radiation (feind)" "print" (die andere Partei wurde verbrannt! ")" " Es ist nicht in der Flammenemissionsmethode von Lizardon enthalten.

Auf diese Weise wird die Flammenstrahlung von Lizardon nicht verbrannt, und die Flammenstrahlung von Kairyu wird immer verbrannt (das tatsächliche Pokémon ist keine solche Spezifikation).

Zusammenfassung

"Objektorientierte Programmierung von Pokemon gelernt" selbst ist das zweite Gebräu, aber nichts erklärt die drei Hauptelemente der objektorientierten Programmierung wie Kapselung und Vererbung. Ich hoffe es kann gut kommuniziert werden.

Es ist jedoch vertrauter als das Lernen, und es wird Ihr Verständnis definitiv vertiefen, wenn Sie es tatsächlich schreiben, und Sie werden allmählich die Vorzüge der objektorientierten Programmierung verstehen.

Wenn Sie ein Anfänger sind, scheuen Sie sich nicht vor objektorientierter Programmierung und versuchen Sie bitte, sie selbst zu schreiben.

Verweise

Ich verstehe die Objektorientierung nicht! Vorbereitende Übungen, um Ihr Gehirn-Miso in ein Objekt-Gehirn zu verwandeln [Python] Konzept und Schreiben der objektorientierten Programmierung

Recommended Posts

[Python] Mit Pokemon erlernte objektorientierte Programmierung
3. 3. KI-Programmierung mit Python
Python-Programmierung mit Atom
Wettbewerbsfähige Programmierung mit Python
Programmieren mit Python Flask
Programmieren mit Python und Tkinter
Maschinelles Lernen mit Pokemon gelernt
Netzwerkprogrammierung mit Python Scapy
[Swift / Ruby / Python / Java] Objektorientierte Programmierung
Einfache Python + OpenCV-Programmierung mit Canopy
Perceptron-Lernexperiment mit Python
Python-Datenstruktur mit Chemoinfomatik gelernt
Effiziente Netzaufnahme mit Python
1. Mit Python 1-1 gelernte Statistiken. Grundlegende Statistiken (Pandas)
[Python] Mit RxPY (3.0.1) gelernte reaktive Erweiterungen [Rx]
Wettbewerbsprogrammierung mit Python Lokale Umgebungseinstellungen
1. Mit Python 1-3 gelernte Statistiken. Berechnung verschiedener Statistiken (Statistiken)
FizzBuzz in Python3
Python-Programmierhinweis
Scraping mit Python
Statistik mit Python
Scraping mit Python
Python mit Go
Twilio mit Python
In Python integrieren
Spielen Sie mit 2016-Python
AES256 mit Python
Getestet mit Python
Programmieren mit Python
Python beginnt mit ()
mit Syntax (Python)
Bingo mit Python
Zundokokiyoshi mit Python
Excel mit Python
Mikrocomputer mit Python
Mit Python besetzen
Wie man Spaß am Programmieren mit Minecraft hat (Ruby, Python)
Was ist "funktionale Programmierung" und "objektorientiert"? Python Edition
Mit OR-Tools erlernte Optimierung [Lineare Planung: Mehrstufiges Modell]
1. Mit Python 1-2 gelernte Statistiken. Berechnung verschiedener Statistiken (Numpy)
Verwenden Sie Python und word2vec (gelernt) mit Azure Databricks
1. Mit Python 2-1 gelernte Statistiken. Wahrscheinlichkeitsverteilung [diskrete Variable]
Mit OR-Tools erlernte Optimierung [Lineare Planung: Projektmanagement]