snafu hat geschrieben:Ich glaube anhand deines Codes ja nicht, dass du schon bereit für OOP bist, aber musst du für dich selbst entscheiden...
Bisher kam ich in den Kapiteln recht gut vorwärts und OOP wäre eben nun das Kapitel (nach ca. 300 Seiten). Wird ja vermutlich nichts bringen, nun wieder zurückzugehen zu Dingen, die ich mehr oder minder Gut kann oder weiterzugehen, da vermutlich Beispiele mit Klassen im weiteren Verlauf folgen werden.
@all
Ich poste mal beide Originalcodes aus dem Buch. Dieser ist nicht PEP 8 konform und es gibt in der Regel im Code von Michael so manche Dinge, die selbst mir als Anfänger sehr seltsam erscheinen. Vermutlich wird dann der Sinn des Codes klarer.
Normalerweise habe ich mir angewöhnt, die Bezeichner in Englisch zu machen. Da dies aber nur eine Übung ist, benutze ich Deutsche.
Es geht in der Übung um die Erstellung eines "Musical-Mangers" und seinem Backend. Zudem gibt es noch eine dritte .py Datei, die für die 'Ticketreservierung' ist. Diese habe ich weggelassen, da das Beispiel in "Manager" und "Mitarbeiter" unterteilt ist. Bei mir ist es ein Theater, anstatt eines Musicals.
Dadrunter werde ich meinen Code posten, den ich ein relativ frei dem Kopf geschrieben habe und an einigen Stellen verändert habe. Natürlich ist mein Code auch nur ein Teil des ganzen, da ich wie gesagt bis zu dieser Stelle der Übung recht gut vorwärts kam und nun an dieser Sache feststecke.
Mein Problem liegt im zweiten Skript von mir bei Zeile 45:
Code: Alles auswählen
self.daten.Theaterstueck.neue_auffuehrung(auffuehrung)
Zudem versuche ich PEP 8 konform zu arbeiten, und manche Dinge wie "-1" Initialisierungen in Skripten etc. von Michael ändere ich.
Hier beide Codes von Michael:
Code: Alles auswählen
#----------------------------------------------------
# Dateiname: musical.py
# Modul mit Klassen zur Modellierung eines Musicals
#
# Objektorientierte Programmierung mit Python
# Kap. 12
# Michael Weigend 2.10.09
#----------------------------------------------------
# musical.py - Modell eines Musicals
import pickle
class Musical:
def __init__(self, titel, eintrittspreis, saal):
self.titel = titel
self.eintrittspreis = eintrittspreis
self.saal = saal
self.vorstellungen = [] # Liste von Vorstellungen
def getVorstellung(self, datum):
"""Rückgabe eines Vorstellungs-Objektes mit
passendem Datum, falls vorhanden, sonst None"""
for vorstellung in self.vorstellungen:
if vorstellung.datum == datum: return vorstellung
# Nach dem return bricht die Ausführung der Funktion ab
def neueVorstellung(self, vorstellung):
"""Objekt vorstellung wird in Liste eingefügt"""
self.vorstellungen += [vorstellung]
def __str__(self): #1
beschreibung = '\n' + self.titel + '\n' + \
len(self.titel)*'=' + '\n'
for vorstellung in self.vorstellungen:
beschreibung += str(vorstellung) + '\n'
return beschreibung
class Vorstellung:
def __init__(self, datum, beginn, saal ):
self.datum = datum
self.beginn = beginn
self.saalbelegung = Saalbelegung(saal)
self.saal = saal
def __str__(self): #1
beschreibung = self.datum + '\n' + \
str(self.saalbelegung.getFreiePlaetze()) + \
' freie Plätze\n'
return beschreibung
class Saalbelegung:
"""pflegt Liste von Listen mit Platz-Objekten"""
def __init__(self, saal):
self.belegung = []
self.saal = saal
for i in range(len(saal.plaetzeProReihe)): #2
reihe = []
for j in range(saal.plaetzeProReihe[i]):
platz = Platz()
reihe += [platz]
self.belegung += [reihe]
def buche(self, reihe, platz, zuschauer): #3
'''weist dem Platz platz in Reihe reihe einen
Zuschauer zu'''
if not self.belegung[reihe][platz].belegt():
self.belegung[reihe][platz].belege(zuschauer)
return 'Platz gebucht'
else: return 'Platz schon belegt'
def getFreiePlaetze(self):
"""liefert Anzahl der freien Plaetze"""
frei=0
for reihe in self.belegung:
for platz in reihe:
if not platz.belegt(): frei += 1
return frei
def __str__(self): #1
beschreibung = 'Saalbelegung\n'
beschreibung += ' Platz: 1 2 3 4 5 6 7 8 9 10 '
beschreibung += '11 12 13 14\n'
nr = 1 # Reihennummer
for reihe in self.belegung:
beschreibung += 'Reihe ' + format(nr, '2d') + ': '
for platz in reihe:
beschreibung += str(platz)
nr += 1
beschreibung += '\n' # neue Zeile
return beschreibung
class Zuschauer:
def __init__(self, name, tel):
self.name, self.tel = name, tel
Code: Alles auswählen
#----------------------------------------------------
# Dateiname: musicalmanager.py
# Verwaltung eines Musicals - Manager
#
# Objektorientierte Programmierung mit Python
# Kap. 12
# Michael Weigend 2.10.09
#----------------------------------------------------
# musicalmanager.py - Verwaltung eines Musicals
import pickle
from musical import *
class Manager:
__menuetext = """
Musical-Manager
------------------
(n)eue Vorstellung
(U)eberblick Vorstellungen
(E)nde
"""
def __init__(self, datei): #1
self.__datei = datei
self.__lade_musical()
self.__run()
def __run(self): #2
""" Menü und Verarbeitung von Auswahlen"""
print (self.__menuetext)
wahl = '-'
while wahl not in ['e', 'E']:
wahl = input('Auswahl: ')
if wahl in ['n', 'N']:
self.__neueVorstellung()
elif wahl in ['U', 'u']:
print (str(self.__musical))
print (self.__menuetext)
wahl = input('Auswahl: ')
print ("Danke für die Benutzung von Musical-Manager")
self.__speichern()
def __neueVorstellung(self):
"""Dialog zum Einrichten einer neuen Vorstellung"""
datum = input('Termin: ')
beginn = input('Beginn der Vorstellung: ')
vorstellung = Vorstellung(datum, beginn, self.__musical.saal)
self.__musical.neueVorstellung(vorstellung)
def __neuesMusical(self): #3
'''Dialog zur Definition eines neuen Musicals'''
titel = input('Titel: ')
eintrittspreis = float(input('Eintrittspreis: '))
anzahl_reihen = int(input("Anzahl Sitzreihen: "))
liste = []
for i in range(anzahl_reihen):
sitze = int(input("Sitze in Reihe " + str(i) + ": "))
liste.append(sitze)
saal = Saal(liste)
self.__musical = Musical(titel, eintrittspreis, saal)
def __lade_musical(self):
"""Musical-Objekt wird geladen, falls Datei vorhanden
sonst muss neues Musical definiert werden"""
try:
f = open(self.__datei, 'rb') # lesen im Binärmodus
self.__musical = pickle.load(f)
f.close()
print ('\n W I L L K O M M E N')
print ('beim Management-System für das Musical',
self.__musical.titel)
except:
print('Kein Musical gespeichert.')
print('Richten Sie neues Musical ein.')
self.__neuesMusical()
def __speichern(self):
"""Musical-Objekt speichern """
f = open(self.__datei, 'wb') # schreiben im Binärmodus
pickle.dump(self.__musical, f)
f.close()
m = Manager('daten/hairspray.txt') # relative Adresse der Daten-Datei
Hier meine Codes:
Code: Alles auswählen
class Theaterstueck:
def __init__(self, titel, eintrittspreis):
self.titel = titel
self.eintrittspreis = eintrittspreis
self.auffuehrungen = []
def zeige_auffuehrungen(self, datum):
for auffuehrung in self.auffuehrungen:
if auffuehrung.datum == datum:
return auffuehrung
def neue_auffuehrung(self, neu):
self.auffuehrungen += [neu]
class Auffuehrung:
def __init__(self, datum, beginn):
self.datum = datum
self.beginn = beginn
def __str__(self):
pass
Code: Alles auswählen
import pickle
import sys
import theater
class Theatermanager:
def __init__(self, titel):
self.titel = titel
self.dateipfad = ('data/' + self.titel + '.data')
self.daten = theater
self.dateizugriff_lesen()
self.menue()
def dateizugriff_lesen(self):
try:
datei = open(self.dateipfad, 'rb')
self.daten = pickle.load(datei)
datei.close()
print('Lade Theaterstück: ' + self.daten.titel)
input('<ENTER> = Hauptmenü\n')
except FileNotFoundError:
print('Theaterstück', '"' + self.titel + '"', 'inexistent')
input('<ENTER> = Hauptmenü\n')
def dateizugriff_speichern(self):
datei = open(self.dateipfad, 'wb')
pickle.dump(self.daten, datei)
datei.close()
def theaterstueck_neu(self):
while True:
try:
titel = input('Titel des Theaterstücks:')
eintrittspreis = float(input('Eintrittspreis: '))
self.daten = theater.Theaterstueck(titel, eintrittspreis)
return
except ValueError:
print('Eingabe inkorrekt')
continue
def auffuehrung_neu(self):
datum = input('Datum: ')
beginn = input('Beginn: ')
auffuehrung = theater.Auffuehrung(datum, beginn)
self.daten.Theaterstueck.neue_auffuehrung(auffuehrung)
def menue(self):
text = '''Administraton:
[1] - Neues Theaterstück
[2] - Neue Aufführung
[3] - Aufführungen
[0] - Beenden'''
while True:
try:
print(text)
eingabe = int(input('Eingabe: '))
if eingabe == 0:
sys.exit()
elif eingabe == 1:
self.theaterstueck_neu()
elif eingabe == 2:
self.auffuehrung_neu()
elif eingabe == 3:
pass
else:
continue
except ValueError:
continue
self.dateizugriff_speichern()
def main():
eingabe = input('Name des Theaterstücks: ')
Theatermanager(eingabe)
if __name__ == '__main__':
main()
Wer in der Wildnis lebt, muss zum Wolf werden, oder als Schaf sterben.
(Syrisches Sprichwort)