Programmieren für Anfänger in Python/Objektorientierung

Aus PlusPedia
Wechseln zu: Navigation, Suche

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.


Coin Ü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");

  1. 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

Diesen Artikel melden!
Verletzt dieser Artikel deine Urheber- oder Persönlichkeitsrechte?
Hast du einen Löschwunsch oder ein anderes Anliegen? Dann nutze bitte unser Kontaktformular

PlusPedia Impressum
Diese Seite mit Freunden teilen:
Mr Wong Digg Delicious Yiggit wikio Twitter
Facebook




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.


Typo3 Besucherzähler - Seitwert blog counter
java hosting vpn norway