Programmieren für Anfänger in Python/Objektorientierung
Des Schusters Kinder haben die schlechtesten Schuhe.
In Python ist ja alles ein Objekt.
Die Umsetzung der Objektorientierte Programmierung ist in Python dagegen eher ein Witz.
Da wir nun aber damit leben müssen hier ein paar Dinge, die mir aufgefallen sind.
Inhaltsverzeichnis
Übrigens: Die PlusPedia ist NICHT die Wikipedia. Wir sind ein gemeinnütziger Verein, PlusPedia ist werbefrei. Wir freuen uns daher über eine kleine Spende! |
1 Allgemein
Mit diesem Programm könnt ihr die funktionsweise der oop sehen.
Zudem wie man mehrere Objekte in einer Liste verwalten kann.
In diesem Fall habe ich auf setter und getter funktionen verzichtet.
Folgende Dinge sind wichtig:
- jede Klasse sollte eine __init__ - Methode haben, in dieser sollten die Attribute initialisiert werden
- jede Methode sollte mit (self, [eventuell weitere Parameter]) beginnen (Außer ihr wollt explizit statische Funktionen - eher selten)
- ein Objekt wird erzeugt: student = CStudent("Vorname", "Nachname");
beliebter_fehler_student = CStudent; # Dies funktioniert zwar - aber dann bekommt ihr einige Fehlermeldungen wahrscheinlich. In diesem Fall habt ihr kein Objekt von CStudent erzeugt sondern habt eine Referenz auf die * Klasse CStudent erzeugt. das heißt: student = beliebter_fehler_student(...) müsste funktionieren. Kann sehr praktisch sein. Aber ist in dem Fall nicht das, was ihr wollt.
Und jetzt der Quelltext:
class CStudent:
i_anzahl_der_studenten = 0;
def __init__(self, s_vorname, s_nachname): #begin
self.s_vorname = s_vorname;
self.s_nachname = s_nachname;
#enddef __init__
def wie_heisst_du(self): #begin
return self.s_nachname+", "+self.s_vorname + " " + self.s_nachname
#enddef wie_heisst_du
pass; #end class CStudent
list_students = []
student_claudia_mit_c = CStudent("Claudia", "Mit C");
list_students.append(student_claudia_mit_c);
student_klaudia_mit_k = CStudent("Klaudia", "Mit K");
list_students.append(student_klaudia_mit_k);
student_anton = CStudent("James", "Bond");
list_students.append(student_anton);
for student in list_students: # do begin
print(student.wie_heisst_du());
pass; #endfor
2 Gefahren
2.1 Erste Gefahr
Was man machen kann ist folgendes:
def immatrikulieren(self, s_matrikel_nr): #begin
self.s_matrikel_nr = s_matrikel_nr;
#enddef
Man kann in Methoden einem Objekt neue Attribute geben.
Ich halte das für sehr fraglich:
Ich hätte die folgende Ausgabe so programmiert:
for student in list_students: # do begin
print(student.wie_heisst_du());
if (student.s_matrikel_nr is not None): print(student.s_matrikel_nr);
pass; #endfor
doch bevor die Methode immatrikulieren nicht aufgerufen wurde gibt es das Attribut s_matrikel_nr nicht.
so würde ich es NICHT programmieren (so etwas gehört eigentlich verboten):
class CStudent:
i_anzahl_der_studenten = 0;
def __init__(self, s_vorname, s_nachname): #begin
self.s_vorname = s_vorname;
self.s_nachname = s_nachname;
#enddef __init__
def immatrikulieren(self, s_matrikel_nr): #begin
self.s_matrikel_nr = s_matrikel_nr;
#enddef
def wie_heisst_du(self): #begin
return self.s_nachname+", "+self.s_vorname + " " + self.s_nachname
#enddef wie_heisst_du
pass; #end class CStudent
list_students = []
student_claudia_mit_c = CStudent("Claudia", "Mit C");
list_students.append(student_claudia_mit_c);
student_klaudia_mit_k = CStudent("Klaudia", "Mit K");
list_students.append(student_klaudia_mit_k);
student_anton = CStudent("James", "Bond");
list_students.append(student_anton);
for student in list_students: # do begin
print(student.wie_heisst_du());
if (student.s_matrikel_nr is not None): print(student.s_matrikel_nr);
pass; #endfor
So finde ich es richtig:
class CStudent:
i_anzahl_der_studenten = 0;
def __init__(self, s_vorname, s_nachname): #begin
self.s_vorname = s_vorname;
self.s_nachname = s_nachname;
self.s_matrikel_nr = None;
#enddef __init__
def immatrikulieren(self, s_matrikel_nr): #begin
self.s_matrikel_nr = s_matrikel_nr;
#enddef
def wie_heisst_du(self): #begin
return self.s_nachname+", "+self.s_vorname + " " + self.s_nachname
#enddef wie_heisst_du
pass; #end class CStudent
list_students = []
student_claudia_mit_c = CStudent("Claudia", "Mit C");
list_students.append(student_claudia_mit_c);
student_klaudia_mit_k = CStudent("Klaudia", "Mit K");
list_students.append(student_klaudia_mit_k);
student_anton = CStudent("James", "Bond");
list_students.append(student_anton);
for student in list_students: # do begin
print(student.wie_heisst_du());
if (student.s_matrikel_nr is not None): print(student.s_matrikel_nr);
pass; #endfor
Mein Tipp: Definiert alle Variablen im __init__-Block, die ihr verwenden wollt.
2.2 Schweinereien
2.2.1 Erste Schweinerei
class CStudent:
i_anzahl_der_studenten = 0;
def __init__(self, s_vorname, s_nachname): #begin
self.s_vorname = s_vorname;
self.s_nachname = s_nachname;
self.s_matrikel_nr = None;
#enddef __init__
pass; #end class CStudent
student_anton = CStudent("James", "Bond");
student_anton.Freundin = "Pünktchen";
print (student_anton.Freundin);
Das ist gültiger Python-Code.
Und hier fängt es an Kriminell zu werden.
Wir können unserem Objekt Attribute ausdenken.
Das mag praktisch erscheinen -
aber ich halte dies für hochgradig gefährlich.
Stellt euch so was vor:
def brave_funktion(student):
student.lange_nase = True;
polizei.untersuchung(student):
student.zeig_mal_deine_ganze_attribute();
# oh eine lange_nase also
2.2.2 Zweite Schweinerei
"__" - bietet einen relativ guten Schutz zur Geheimhaltung.
Aber folgender Code funktioniert:
class CStudent:
i_anzahl_der_studenten = 0;
__private_variable = "geheim";
def __init__(self, s_vorname, s_nachname): #begin
self.s_vorname = s_vorname;
self.s_nachname = s_nachname;
self.s_matrikel_nr = None;
self.__private_variable = "geheim";
#enddef __init__
def tell_me_secret(self): #return string #begin
print(self.__private_variable);
pass; #enddef
pass; #end class CStudent
student_boese = CStudent("Gold", "Finger");
- print (student_boese.__private_variable); - Das geht nicht
student_boese.__private_variable = "Aber Hallo";
print (student_boese.__private_variable);
student_boese.tell_me_secret()
>>> ================================ RESTART ================================
>>>
Aber Hallo
geheim
dass man so was nicht machen sollte - ist klar:
student_boese.__private_variable = "Aber Hallo";
Aber dass es Python erlaubt ist fraglich.
In diesem Fall hat man nämlich zwei Variablen mit eigentlich demselben Namen.
2.3 Dritte Gefahr
Statische Typen | Objektorientierung | OO-Design |
3 Links und Quellen
3.1 Siehe auch
3.2 Weblinks
3.3 Quellen
3.4 Literatur
3.5 Einzelnachweise
4 Andere Lexika
Wikipedia kennt dieses Lemma (Programmieren für Anfänger in Python/Objektorientierung) vermutlich nicht.
Hast du einen Löschwunsch oder ein anderes Anliegen? Dann nutze bitte unser Kontaktformular
PlusPedia Impressum
Bitte Beachte:
Sämtliche Aussagen auf dieser Seite sind ohne Gewähr.
Für die Richtigkeit der Aussagen übernimmt die Betreiberin keine Verantwortung.
Nach Kenntnissnahme von Fehlern und Rechtsverstößens ist die Betreiberin selbstverständlich bereit,
diese zu beheben.
Verantwortlich für jede einzelne Aussage ist der jeweilige Erstautor dieser Aussage.
Mit dem Ergänzen und Weiterschreiben eines Artikels durch einen anderen Autor
werden die vorhergehenden Aussagen und Inhalte nicht zu eigenen.
Die Weiternutzung und Glaubhaftigkeit der Inhalte ist selbst gegenzurecherchieren.