Programmieren für Anfänger in Python/Statische Typen

Aus PlusPedia
Wechseln zu: Navigation, Suche

Das Konzept der statischen Variable ist relativ wichtig - Daher hier ein paar Anmerkungen.

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

Man stelle sich vor eine Klasse:
class CStudent:
  i_anzahl_der_studenten = 0;
  def StatischeMethode(): # begin
    print ("Ich gehöre keinem Objekt");
  #enddef StatischeMethode()

  def immatrikulieren(self): # begin
    CStudent.i_anzahl_der_studenten = CStudent.i_anzahl_der_studenten + 1;
  #enddef immatrikulieren();
 
  def exmatrikulieren(self): # begin
    CStudent.i_anzahl_der_studenten = CStudent.i_anzahl_der_studenten - 1;
  pass; #enddef exmatrikulieren
pass; #end class CStudent

student_claudia_mit_c = CStudent();
student_klaudia_mit_k = CStudent();
student_anton = CStudent();
student_berta = CStudent();

print(student_claudia_mit_c.i_anzahl_der_studenten);
print(CStudent.i_anzahl_der_studenten);
student_claudia_mit_c.immatrikulieren();

print("Claudia mit c:", student_claudia_mit_c.i_anzahl_der_studenten);
print("Klasse:", CStudent.i_anzahl_der_studenten);

student_anton.immatrikulieren();
print("Claudia mit c:", student_claudia_mit_c.i_anzahl_der_studenten);
print("Anton :", student_anton.i_anzahl_der_studenten);
print("Klasse:", CStudent.i_anzahl_der_studenten);

CStudent.StatischeMethode();

  1. Das folgende geht nicht:

student_claudia_mit_c.StatischeMethode();


liefert folgendes Ergebnis:

>>> ================================ RESTART ================================
>>>
0
0
Claudia mit c: 1
Klasse: 1
Claudia mit c: 2
Anton : 2
Klasse: 2
Ich gehöre keinem Objekt
Traceback (most recent call last):
  File "C:/Python32/ante/tests/Studenten_Static.py", line 35, in <module>
    student_claudia_mit_c.StatischeMethode();
TypeError: StatischeMethode() takes no arguments (1 given)
>>>


Daraus ergibt sich folgendes.
Mit einer statischen Variable lässt sich ein Zustand über alle Objekte hinweg retten. Wenn ein Objekt verschwindet, so bleibt der Zustand der statischen Variable erhalten.

In diesem Fall nutzen wir die Statische Variable, um die Anzahl der Studenten zu zählen.

1.1 Erste Gefahr

1. Gefahr, die mir aufgefallen ist:

class CStudent:
  i_anzahl_der_studenten = 0;
  def StatischeMethode(): # begin
    print ("Ich gehöre keinem Objekt");
  #enddef StatischeMethode()

  def immatrikulieren(self): # begin
    print ("Immatrikulieren");
    CStudent.i_anzahl_der_studenten = CStudent.i_anzahl_der_studenten + 1;
  #enddef immatrikulieren();
 
  def exmatrikulieren(self): # begin
    print ("Exmatrikulieren");
    CStudent.i_anzahl_der_studenten = CStudent.i_anzahl_der_studenten - 1;
  pass; #enddef exmatrikulieren

  def ich_bin_superdoof(self): #begin
    print("Es geht - aber klug ist es nicht.");
    self.i_anzahl_der_studenten = self.i_anzahl_der_studenten + 1;
  pass; #enddef
pass; #end class CStudent

student_claudia_mit_c = CStudent();
student_klaudia_mit_k = CStudent();
student_anton = CStudent();
student_xeenaaaiad = CStudent();

print(student_claudia_mit_c.i_anzahl_der_studenten);
print(CStudent.i_anzahl_der_studenten);
student_claudia_mit_c.immatrikulieren();

print("Claudia mit c:", student_claudia_mit_c.i_anzahl_der_studenten);
print("Klasse:", CStudent.i_anzahl_der_studenten);

student_anton.immatrikulieren();
print("Claudia mit c:", student_claudia_mit_c.i_anzahl_der_studenten);
print("Anton :", student_anton.i_anzahl_der_studenten);
print("Klasse:", CStudent.i_anzahl_der_studenten);

student_xeenaaaiad.immatrikulieren();
print("Claudia mit c:", student_claudia_mit_c.i_anzahl_der_studenten);
print("Anton :", student_anton.i_anzahl_der_studenten);
print("xeenaaaiad :", student_xeenaaaiad.i_anzahl_der_studenten);
print("Klasse:", CStudent.i_anzahl_der_studenten);

student_xeenaaaiad.ich_bin_superdoof();
print("Claudia mit c:", student_claudia_mit_c.i_anzahl_der_studenten);
print("Anton :", student_anton.i_anzahl_der_studenten);
print("xeenaaaiad :", student_xeenaaaiad.i_anzahl_der_studenten);
print("Klasse:", CStudent.i_anzahl_der_studenten);


Python erlaubt uns die statische Variable mit self.Variable zu ändern.

Dies führt dazu, dass das Konzept der statischen Variable aber ausgehebebelt wird - und kann zu merkwürdigen Ergebnissen führen:

>>> ================================ RESTART ================================
>>>
0
0
Immatrikulieren
Claudia mit c: 1
Klasse: 1
Immatrikulieren
Claudia mit c: 2
Anton : 2
Klasse: 2
Immatrikulieren
Claudia mit c: 3
Anton : 3
xeenaaaiad : 3
Klasse: 3
Es geht - aber klug ist es nicht.
Claudia mit c: 3
Anton : 3
xeenaaaiad : 4
Klasse: 3
>>>

Aus diesem Grunde sollte man in einer Klasse bei statischen Variablen folgendes vermeiden:

  def doofer_schritt(self): #begin
    self.i_static_anzahl_der_studenten = self.i_static_anzahl_der_studenten + 1;
  pass; #enddef


Das bringt das Konzept der statischen Variablen durcheinander.


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