Inhaltsverzeichnis:
1. Einleitung
2. Allgemeine Grundlagen
2.1. Klassen
2.2. Datentypen
2.3. Methoden
2.4. Verzweigungen
2.5. Schleifen
2.6. Vererbung
3. Grafische Benutzeroberfläche mit den Klassen aus der UI
4. Interaktion mit Lua(Quests)
5. Algorithmische Aufgaben
1. Einleitung
Guten Tag, liebe Community.
Im folgenden All-In One Guide möchte ich euch den Pythongebrauch in Metin2 etwas näher bringen.
Da ich bisher noch kein detailliertes Guide gefunden habe und viele Epvper nur Ansätze erklären, dabei jedoch die relevanten Begriffe meist weglassen, wollte ich das alles mal in einem großen Thread zusammenbringen. Da das mein erster Release-Thread ist habe ich mir gedacht: "Da mach ich wenigstens etwas brauchbares."
Eine kleine Voraussetzung gebe ich jetzt einfach mal vor: Ihr sollten mit den Begriffen "Operatoren" und "Variablen" etwas anfangen können.
Also Let's go !!
2. Allgemeine Grundlagen
Im ersten Teil meiner Guide-Serie möchte ich euch zunächst die Grundlagen von Python erklären.
Ohne diese Grundlagen werdet ihr vermutlich die weiteren Erklärungen nicht verstehen können.
Fangen wir mal an:
Python ist eine universelle, höhere Programmiersprache, die versucht durch einen neuen Syntax den eigentlichen Code zu verkürzen und die Programmstruktur somit
verständlicher und übersichtlicher zu machen (wie z.B. durch den Verzicht von Klammern zur Bildung von Codeteilen).
Klären wir erstmal den Begriff "Programmiersprache" und damit auch objektorientierte Programmierung.
Wenn wir uns mal den ISO Standard anschauen heißt es dort : "Bezieht sich auf eine Technik oder Programmiersprache, welche Objekte, Klassen und Vererbung unterstützt.".
Das bedeutet es gibt einmal Sprachen die diese Technik nicht unterstützen, die sogenannten Scriptspachen, und einmal die Programmiersprachen.
Eine Programmiersprache zieht es also vor alle Sachen in Strukturen zu unterteilen.
Machen wir ein Beispiel.
Stellen wir uns mal vor wir haben nun ein Auto vor uns, das ist nun unsere Superklasse oder Basisklasse.
Nun unterteilen wir wiederum dieses Auto in kleinere Elemente in die sogenannten Unterklassen also z.B. Tür, Reifen, Motor.
Wenn wir jetzt noch den Begriff Vererbung ins Spiel bringen wollen sehen wir einfach mal Motor als sogenannten Oberklasse an. Die Oberklasse unterteilen wir jetzt in die Unterklassen "Ottomotor" und "Dieselmotor", so erben die zwei Unterklassen
die grundlegenden Eigenschaften von der Oberklasse "Motor" aber haben in ihrer Klasse selbst dann zusätzliche andere Eigenschaften. Das kann man auch auf das echte Leben übertragen, als Beispiel nehmen wir wieder unsere Motoren einmal der Ottomotor wo das Benzin sofort verbrannt wird um die Energie zu gewinnen und
einmal der Dieselmotor wo zunächst viel Druck nötigt ist das man die Kohlenwasserstoffe zu Energiegewinnung nutzen kann.
Also haben wir eine Klasse die wiederum aus anderen Klassen besteht. Einfach gesagt für die Klasse Auto brauchen wir aber auch die Klassen Motor, Türen, Fenster, Sitze und so weiter.
Was ist aber jetzt ein Objekt.
Ein Objekt ist ein bestimmtes Auto was durch Klasse Auto erstellt wurde.
2.1. Klassen
Jetzt wissen wir was eine Klasse ist aber wie genau sieht sie nun aus?
Schauen wir uns das an einem konkreten Beispiel einmal an.
Natürlich in einer sehr vereinfachten Form:
Zunächst haben wir die Klasse Auto durch den Befehl "class Auto" definiert.
Im nächsten Schritt werden wir nun ein Objekt der Klasse erstellen.
Jetzt ist "objekt" ein Objekt der Klasse Auto. In dem Moment wo wir "Auto()" aufrufen wird automatisch die Built-In Methode __init__ aufgerufen also der sogenannte Konstruktor und durch die Parameter oder Übergabewerte werden dann die Variablen des Objekts initialisiert.
Desweitern gibt es noch die Methode __del__ die ebenfalls automatisch aufgerufen wird sobald man das Objekt mit "del Objekt" wieder löschen möchte als der sogenannte Destruktor. Nochmal zusammengefasst wir haben hier zwei Methoden, die aufgerufen werden wenn wir ein Objekt erzeugen(Konstruktur also __init__) oder auflösen(Destruktor also __del__) möchten.
Zusätzlich können Konstruktoren mit Parametern versehen werden, wobei diese nicht jedesmal gesetzt werden müssen, dass sehen wir an dem Beispiel von der Preis Variable.
Diese ist automatisch gesetzt, muss aber nicht im Konstruktoraufruf extra gesetzt werden (im weiteren Verlauf der Serie werde ich dazu noch sinnvolle Beispiele machen).
Viele von euch werden sich nun verständlicherweise fragen was diese "self" bedeutet.
Das "self" kann man mit dem "this" aus Java und C++ vergleichen es legt lediglich eine Referenz auf das Objekt, das bedeutet durch dieses "self" weiß der Methodenaufruf zu welchem Objekt es gehört und auf welches Objekt diese Methode angewendet werden soll.
2.2. Datentypen
Fangen wir mal ganz einfach an nämlich mit dem Nichts.
Dieses "None" repräsentiert das Nichts und wird oft bei mathematischen Berechnungen verwendet wo z.B. alle komplexen Zahlen eine Lösung ergeben aber es auch sein kann wenn man durch 0 teilt das keine Lösung möglich ist und was gibt es einfacheres als das Nichts?
Da wir bereits wissen was Operatoren sind gehen wir gleich über zu den nummerischen Datentypen.
Nummerische Datentypen
Ganzzahlen
Wenn man eine ganze Zahl initialisieren möchte nimmt man vorzugsweise ein normales "int", da sollte man jedoch drauf achten das "int" ein begrenzten Zahlenraum hat (was wir bei "long" nicht haben).
Möchten wir also eine sehr große Zahl initialisieren sollten wir das "long" benutzen das am Ende mit einem "L" gekennzeichnet wird.
Gleitkommazahlen
Hier halte ich mich ganz kurz, da es eigentlich nur ein "float" gibt das man so definiert:
Wenn wir gerne mit Potenzen und Exponenten arbeiten möchten ist das kein Problem. Genau wie bei einem Taschenrechner wird einfach ein e-1133 drangehängt.
Boolesche Werte
Oder auch einfach "bool" hier unterscheiden wir lediglich zwischen Richtig und Falsch oder Wahr und Unwahr.
Sequenzielle Datentypen
Diese Datentypen können Elemente mit einer definierten Reihenfolge verwalten und indizieren.
Tuple - tuple
Dies ist eine Liste von Elementen die einen festgelegten Anfang und ein festgelegtes Ende haben.
Wenn wir nun einen der Werte aus dieser Liste auslesen möchten geht das wie folgt:
So bekommen wir als Ausgabe den Krieger aber wieso ist das so? Eine Liste ist wie eine Tabelle die ebenfalls Reihen und Spalten besitzen kann (in diesem Fall nur Spalten). In Python beginnen die Spalten jedoch mit dem Index 0 und werden dann in Einer-Schritten vorgeführt. Kleine zwischen Aufgabe : Gebe das Element Schamane aus!
Lösung:
List - list
Diese Liste unterscheidet sich kaum zu den Tuple nur das so kein definiertes Ende haben und können beliebig erweitert werden.
Sie wird genauso aufgerufen wie ein Tuple, kann jedoch mit append erweitert werden.
String - str
Dieser Datentyp ist eine Zeichenkette, also eine Folge von Buchstaben, Ziffern und Sonderzeichen. Die Besonderheit dabei ist das man bei den Zeichenketten auch den Operator "+" verwenden kann um sie aneinanderzureihen.
Mapping
Enthält Datentypen die Zuordnungen zwischen verschiedenen Elementen herstellen können.
Dictionary
In diesem Fall gibt es nur einen Datentyp der zu der Kategorie Mapping gehört. Dieses Dictionary kann als Liste angesehen werden wo aber zu den einzelnen Elementen noch eine Zuordnungen stattfindet.
Nehmen wir nun als Beispiel ein Item was verschiedene Werte aufweist wie Bonis, Vnum, usw...
So jetzt haben in dem Dictionary "var_dict" ein Item gespeichert. Wenn wir nun gerne die vnum haben möchten müssen wir einfach die Zuordnungen verwenden.
Als Zuordnungen sollte man jedoch nicht veränderbare Elemente nehmen, denn jedesmal wenn man das Dictionary aufruft ein Hashwert von der Zuordnungen gebildet wird und so das eigentliche Element gefunden wird.
Wenn man aber jetzt veränderbare Zuordnungen nutzt verändert sich der Hashwert auch.
So kann es sein das in der syserr so ein Fehler kommt:
Dieser Fehler kann auch hervorgerufen wenn man z.b. eine Liste also Zuordnung verwendet.
2.3. Methoden
Kommen wir hier nochmal speziell auf die Methoden zusprechen.
Wir haben bisher eine Autoklasse erstellt, die wir mit dem Preis und dem Namen als Objekt erzeugen können. Jetzt möchten wir wissen wie der Name des Autos ist.
Dazu müssen wir eine Methode hinzufügen in dem Fall eine Getter-Methode, da wir etwas zurück bekommen möchten. Zusätzlich möchten wir noch den Namen ändern können, also die sogenannte Setter-Methode.
Was haben wir nun getan?
Wir haben mit "def methodenName" eine Methode definiert und als Referenz "self" angegeben.
Bei unser "getName" Methode bekommen wir durch die Funktion "return" den Namen wieder zurück.
Weiter geht's mit der "setName" Methode dort haben wir noch ein zusätzlichen Parameter angegeben da wir ja gerne den Namen des Autos ändern möchten.
Dieser Parameter wird dann der "name" Variable zugewiesen.
Jetzt fragt ihr euch sicherlich: "Alles schön und gut aber wie kann ich jetzt die Methoden aufrufen?!".
Ganz einfach, wir wissen ja bereits wie man ein Objekt erzeugt nun müssen wir einfach den Methodenaufruf hintendran hängen.
Durch den Punkt erhält man Zugang auf weitere Elemente des Objekts, in diesem Fall die Methoden.
Im nächsten und letzten Schritt möchten wir nun noch einen Chat ausgeben wenn ein Objekt erstellt wurde.
Also erstellen wir eine weitere Methode die den Chat dann ausgibt. Man kann das auch direkt in den Konstruktor schreiben, aber ich wollte nochmal verdeutlichen wie man innerhalb der Klasse Methoden aufrufen kann.
Wir rufen also innerhalb von Klassen die Methoden durch den Referenzzeiger auf.
2.4 Verweigungen
In diesem Teil beschäftigen wir uns mit den Verzweigungen oder auch bedingten Anweisungen.
Sie dienen dazu, ein Programm in mehrere Pfade oder eben Verzweigungen aufzuteilen.
Nehmen wir wieder das Beispiel mit unser Autoklasse dort möchten wir jetzt eine Bedingung für eine gewisse Anweisung hinzufügen.
Unsere Aufgabe ist nun abzufragen ob der Preis gesetzt ist, falls ja soll ein Text ausgegeben werde.
Also sieht der Syntax wie folgt aus.
Hier hab ich noch zwei weitere Funktionen ins Spiel gebracht einmal das "elif" oder auf Deutsch einfach andernfalls.
Durch das "elif" können wir eine weitere Bedingung für unsere spezielle Situation festlegen.
Zu guter letzt noch das "else" was man mit sonst übersetzen kann. Die Funktion bewirkt einfach, dass wenn keine der Bedingungen zutreffen sollte. die Anweisung des else-Blocks ausgeführt wird.
Wenden wir das wieder auf unser konkretes Beispiel an. Wir möchten nun zusätzlich noch abfragen ob der Preis realistisch ist und nehmen daher als Basiswert 5000 Euro.
Jetzt müsste uns allen auffallen das ich die eigentliche Bedingung erweitern musste,
denn wenn ich bei dem "elif" nur die Bedingung haben würde, dass es kleiner als 5000 sein muss, trifft das auch für unsere "if" Bedingung oft zu.
Als kleine Bemerkung dazu muss uns klar sein: Sobald wir in eine Anweisung dieser Verzweigung gelangt sind, wird keine weiter Abfrage der Bedingungen stattfinden und das Programm unterhalb des Code-Blocks weitergeführt.
Ich habe absichtlich keine Kategorien fertiggestellt, weil ich sehen wollte ob es in dem Ausmaß überhaupt gefragt ist. Ob es in einer gekürzten Form gefragt, oder gar nicht in Anspruch genommen wird. Solltet ihr Anregungen, Verbesserungswünsche oder eine Idee für ein besseres Format haben, immer her damit! Ich habe zunächst versucht in einem sehr einfachen Deutsch zu schreiben ohne viele Fremdwörter zu verwenden, ich hoffe das ist mir gelungen.
Im weiteren Verlauf, wenn wir zu den GUIS gelangen werde ich natürlich viele Beispiele veröffentlichen und dazu ein oder zwei Releases, aber auch bei der Interaktion mit Lua könnt ihr gern Beispiele ergänzen, die man dann in den Guide einbaut und anhand dessen die Materie noch ausführlicher erklärt.
Special Thanks:
JusticeTheVoice
King Regards,
Copy
1. Einleitung
2. Allgemeine Grundlagen
2.1. Klassen
2.2. Datentypen
2.3. Methoden
2.4. Verzweigungen
2.5. Schleifen
2.6. Vererbung
3. Grafische Benutzeroberfläche mit den Klassen aus der UI
4. Interaktion mit Lua(Quests)
5. Algorithmische Aufgaben
1. Einleitung
Guten Tag, liebe Community.
Im folgenden All-In One Guide möchte ich euch den Pythongebrauch in Metin2 etwas näher bringen.
Da ich bisher noch kein detailliertes Guide gefunden habe und viele Epvper nur Ansätze erklären, dabei jedoch die relevanten Begriffe meist weglassen, wollte ich das alles mal in einem großen Thread zusammenbringen. Da das mein erster Release-Thread ist habe ich mir gedacht: "Da mach ich wenigstens etwas brauchbares."
Eine kleine Voraussetzung gebe ich jetzt einfach mal vor: Ihr sollten mit den Begriffen "Operatoren" und "Variablen" etwas anfangen können.
Also Let's go !!
2. Allgemeine Grundlagen
Im ersten Teil meiner Guide-Serie möchte ich euch zunächst die Grundlagen von Python erklären.
Ohne diese Grundlagen werdet ihr vermutlich die weiteren Erklärungen nicht verstehen können.
Fangen wir mal an:
Python ist eine universelle, höhere Programmiersprache, die versucht durch einen neuen Syntax den eigentlichen Code zu verkürzen und die Programmstruktur somit
verständlicher und übersichtlicher zu machen (wie z.B. durch den Verzicht von Klammern zur Bildung von Codeteilen).
Klären wir erstmal den Begriff "Programmiersprache" und damit auch objektorientierte Programmierung.
Wenn wir uns mal den ISO Standard anschauen heißt es dort : "Bezieht sich auf eine Technik oder Programmiersprache, welche Objekte, Klassen und Vererbung unterstützt.".
Das bedeutet es gibt einmal Sprachen die diese Technik nicht unterstützen, die sogenannten Scriptspachen, und einmal die Programmiersprachen.
Eine Programmiersprache zieht es also vor alle Sachen in Strukturen zu unterteilen.
Machen wir ein Beispiel.
Stellen wir uns mal vor wir haben nun ein Auto vor uns, das ist nun unsere Superklasse oder Basisklasse.
Nun unterteilen wir wiederum dieses Auto in kleinere Elemente in die sogenannten Unterklassen also z.B. Tür, Reifen, Motor.
Wenn wir jetzt noch den Begriff Vererbung ins Spiel bringen wollen sehen wir einfach mal Motor als sogenannten Oberklasse an. Die Oberklasse unterteilen wir jetzt in die Unterklassen "Ottomotor" und "Dieselmotor", so erben die zwei Unterklassen
die grundlegenden Eigenschaften von der Oberklasse "Motor" aber haben in ihrer Klasse selbst dann zusätzliche andere Eigenschaften. Das kann man auch auf das echte Leben übertragen, als Beispiel nehmen wir wieder unsere Motoren einmal der Ottomotor wo das Benzin sofort verbrannt wird um die Energie zu gewinnen und
einmal der Dieselmotor wo zunächst viel Druck nötigt ist das man die Kohlenwasserstoffe zu Energiegewinnung nutzen kann.
Also haben wir eine Klasse die wiederum aus anderen Klassen besteht. Einfach gesagt für die Klasse Auto brauchen wir aber auch die Klassen Motor, Türen, Fenster, Sitze und so weiter.
Was ist aber jetzt ein Objekt.
Ein Objekt ist ein bestimmtes Auto was durch Klasse Auto erstellt wurde.
2.1. Klassen
Jetzt wissen wir was eine Klasse ist aber wie genau sieht sie nun aus?
Schauen wir uns das an einem konkreten Beispiel einmal an.
Natürlich in einer sehr vereinfachten Form:
PHP Code:
class Auto:
def __init__(self, name, preis = 0 ):
self.name = name
self.preis = preis
def __del__(self):
pass
#this is a Destruktor
Im nächsten Schritt werden wir nun ein Objekt der Klasse erstellen.
PHP Code:
objekt = Auto("Bugatti",1000000000)
Desweitern gibt es noch die Methode __del__ die ebenfalls automatisch aufgerufen wird sobald man das Objekt mit "del Objekt" wieder löschen möchte als der sogenannte Destruktor. Nochmal zusammengefasst wir haben hier zwei Methoden, die aufgerufen werden wenn wir ein Objekt erzeugen(Konstruktur also __init__) oder auflösen(Destruktor also __del__) möchten.
Zusätzlich können Konstruktoren mit Parametern versehen werden, wobei diese nicht jedesmal gesetzt werden müssen, dass sehen wir an dem Beispiel von der Preis Variable.
Diese ist automatisch gesetzt, muss aber nicht im Konstruktoraufruf extra gesetzt werden (im weiteren Verlauf der Serie werde ich dazu noch sinnvolle Beispiele machen).
Viele von euch werden sich nun verständlicherweise fragen was diese "self" bedeutet.
Das "self" kann man mit dem "this" aus Java und C++ vergleichen es legt lediglich eine Referenz auf das Objekt, das bedeutet durch dieses "self" weiß der Methodenaufruf zu welchem Objekt es gehört und auf welches Objekt diese Methode angewendet werden soll.
2.2. Datentypen
Fangen wir mal ganz einfach an nämlich mit dem Nichts.
PHP Code:
Summe = None
Da wir bereits wissen was Operatoren sind gehen wir gleich über zu den nummerischen Datentypen.
Nummerische Datentypen
Ganzzahlen
PHP Code:
var_int = 235235
var_long = 12345983128973279823987523L
Möchten wir also eine sehr große Zahl initialisieren sollten wir das "long" benutzen das am Ende mit einem "L" gekennzeichnet wird.
Gleitkommazahlen
Hier halte ich mich ganz kurz, da es eigentlich nur ein "float" gibt das man so definiert:
PHP Code:
var_float= 1337.2424
Boolesche Werte
Oder auch einfach "bool" hier unterscheiden wir lediglich zwischen Richtig und Falsch oder Wahr und Unwahr.
PHP Code:
var_bool = True
var_bool = False
Diese Datentypen können Elemente mit einer definierten Reihenfolge verwalten und indizieren.
Tuple - tuple
Dies ist eine Liste von Elementen die einen festgelegten Anfang und ein festgelegtes Ende haben.
PHP Code:
var_tuple = ("Krieger","Ninja","Sura","Schamane")
PHP Code:
var_tuple[0]
Lösung:
List - list
Diese Liste unterscheidet sich kaum zu den Tuple nur das so kein definiertes Ende haben und können beliebig erweitert werden.
PHP Code:
var_list = ["Krieger","Ninja","Sura","Schamane"]
PHP Code:
var_list.append("Wolfman")
Dieser Datentyp ist eine Zeichenkette, also eine Folge von Buchstaben, Ziffern und Sonderzeichen. Die Besonderheit dabei ist das man bei den Zeichenketten auch den Operator "+" verwenden kann um sie aneinanderzureihen.
PHP Code:
a = "Ich bin ein"
b = "Krieger"
c = " "
print a+c+b
Ausgabe: Ich bin ein Krieger
Enthält Datentypen die Zuordnungen zwischen verschiedenen Elementen herstellen können.
Dictionary
In diesem Fall gibt es nur einen Datentyp der zu der Kategorie Mapping gehört. Dieses Dictionary kann als Liste angesehen werden wo aber zu den einzelnen Elementen noch eine Zuordnungen stattfindet.
Nehmen wir nun als Beispiel ein Item was verschiedene Werte aufweist wie Bonis, Vnum, usw...
PHP Code:
var_dict = {
"vnum": 10,
"boni1_id": 1
"boni1_var": 1000}
PHP Code:
var_dict["vnum"]
Wenn man aber jetzt veränderbare Zuordnungen nutzt verändert sich der Hashwert auch.
So kann es sein das in der syserr so ein Fehler kommt:
PHP Code:
TypeError: list objects are unhashable
2.3. Methoden
Kommen wir hier nochmal speziell auf die Methoden zusprechen.
Wir haben bisher eine Autoklasse erstellt, die wir mit dem Preis und dem Namen als Objekt erzeugen können. Jetzt möchten wir wissen wie der Name des Autos ist.
Dazu müssen wir eine Methode hinzufügen in dem Fall eine Getter-Methode, da wir etwas zurück bekommen möchten. Zusätzlich möchten wir noch den Namen ändern können, also die sogenannte Setter-Methode.
PHP Code:
class Auto:
def __init__(self, name, preis = 0 ):
self.name = name
self.preis = preis
def __del__(self):
pass
#this is a Destruktor
def getName(self):
return self.name
def setName(self, name):
self.name = name
Wir haben mit "def methodenName" eine Methode definiert und als Referenz "self" angegeben.
Bei unser "getName" Methode bekommen wir durch die Funktion "return" den Namen wieder zurück.
Weiter geht's mit der "setName" Methode dort haben wir noch ein zusätzlichen Parameter angegeben da wir ja gerne den Namen des Autos ändern möchten.
Dieser Parameter wird dann der "name" Variable zugewiesen.
Jetzt fragt ihr euch sicherlich: "Alles schön und gut aber wie kann ich jetzt die Methoden aufrufen?!".
Ganz einfach, wir wissen ja bereits wie man ein Objekt erzeugt nun müssen wir einfach den Methodenaufruf hintendran hängen.
PHP Code:
objekt = Auto("Audi")
objekt.getName() # dies können wir wiederum in einer Variablen abspeichern
objekt.setName("Audi R8")
Im nächsten und letzten Schritt möchten wir nun noch einen Chat ausgeben wenn ein Objekt erstellt wurde.
Also erstellen wir eine weitere Methode die den Chat dann ausgibt. Man kann das auch direkt in den Konstruktor schreiben, aber ich wollte nochmal verdeutlichen wie man innerhalb der Klasse Methoden aufrufen kann.
PHP Code:
class Auto:
def __init__(self, name, preis = 0 ):
self.name = name
self.preis = preis
self.chatAusgabe()
def __del__(self):
pass
#this is a Destruktor
def chatAusgabe(self):
print "das Objekt wurde erstellt"
def getName(self):
return self.name
def setName(self, name):
self.name = name
2.4 Verweigungen
In diesem Teil beschäftigen wir uns mit den Verzweigungen oder auch bedingten Anweisungen.
Sie dienen dazu, ein Programm in mehrere Pfade oder eben Verzweigungen aufzuteilen.
Nehmen wir wieder das Beispiel mit unser Autoklasse dort möchten wir jetzt eine Bedingung für eine gewisse Anweisung hinzufügen.
Unsere Aufgabe ist nun abzufragen ob der Preis gesetzt ist, falls ja soll ein Text ausgegeben werde.
PHP Code:
class Auto:
def __init__(self, name, preis = 0 ):
self.name = name
self.preis = preis
self.chatAusgabe()
if self.preis != 0:
print "Preis wurde erfolgreich gesetzt."
PHP Code:
if Bedingung: #falls
Anweisung
elif Bedingung: #andernfalls
Anweisung
else: #sonst
Anweisung
Durch das "elif" können wir eine weitere Bedingung für unsere spezielle Situation festlegen.
Zu guter letzt noch das "else" was man mit sonst übersetzen kann. Die Funktion bewirkt einfach, dass wenn keine der Bedingungen zutreffen sollte. die Anweisung des else-Blocks ausgeführt wird.
Wenden wir das wieder auf unser konkretes Beispiel an. Wir möchten nun zusätzlich noch abfragen ob der Preis realistisch ist und nehmen daher als Basiswert 5000 Euro.
PHP Code:
class Auto:
def __init__(self, name, preis = 0 ):
self.name = name
self.preis = preis
self.chatAusgabe()
if self.preis != 0 and self.preis >= 5000:
print "Preis wurde erfolgreich gesetzt."
elif self.preis < 5000 and self.preis != 0:
print "Dieser Preis ist nicht realistisch!"
else:
print "Der Preis wurde noch nicht gesetzt."
denn wenn ich bei dem "elif" nur die Bedingung haben würde, dass es kleiner als 5000 sein muss, trifft das auch für unsere "if" Bedingung oft zu.
Als kleine Bemerkung dazu muss uns klar sein: Sobald wir in eine Anweisung dieser Verzweigung gelangt sind, wird keine weiter Abfrage der Bedingungen stattfinden und das Programm unterhalb des Code-Blocks weitergeführt.
Ich habe absichtlich keine Kategorien fertiggestellt, weil ich sehen wollte ob es in dem Ausmaß überhaupt gefragt ist. Ob es in einer gekürzten Form gefragt, oder gar nicht in Anspruch genommen wird. Solltet ihr Anregungen, Verbesserungswünsche oder eine Idee für ein besseres Format haben, immer her damit! Ich habe zunächst versucht in einem sehr einfachen Deutsch zu schreiben ohne viele Fremdwörter zu verwenden, ich hoffe das ist mir gelungen.
Im weiteren Verlauf, wenn wir zu den GUIS gelangen werde ich natürlich viele Beispiele veröffentlichen und dazu ein oder zwei Releases, aber auch bei der Interaktion mit Lua könnt ihr gern Beispiele ergänzen, die man dann in den Guide einbaut und anhand dessen die Materie noch ausführlicher erklärt.
Special Thanks:
JusticeTheVoice
King Regards,
Copy