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.
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 **
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.
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 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).
"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.
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