Parameter

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
tieuquay
User
Beiträge: 12
Registriert: Samstag 26. Juli 2008, 08:19

Montag 24. November 2008, 22:10

Code: Alles auswählen

# -*- coding: cp1252 -*-
class Laborkurs:
    dozent = "N.N"
    def __init__(self,maximalTeilnehmerzahl):
##        self.dozent = "N.N."
        self.raum ="N.N."
        self.tagUndZeit = "N.N."
        self.studenten = [ ] 
        self.teilnehmergrenze = maximalTeilnehmerzahl

    def trageStudentEin(self,neuerStudent):
        if (len(self.studenten) == self.teilnehmergrenze):
            print "Der Kurs ist voll, keine Eintragung mehr möglich."
        else:
            self.studenten.append(neuerStudent)

    def anzahlStudenten(self):
        return len(self.studenten)

    def setzeRaum(self,raumnummer):
        self.raum = raumnummer
        
    def setzeTermin(self,tagUndZeit):
        self.tagUndZeit = tagUndZeit

    def setzeDozent(self, dozentenname):
        self.dozent = dozentenname

    def listeAusgeben(self):
        print "Laborkurs:" , self.tagUndZeit
        print "Dozent:" , self.dozent, "   Raum: " , self.raum
        print "Teilnehmerliste:",
##        ausgeben(Student)
        print "Teilnehmeranzahl", len(self.studenten)


class Student:
    def __init__(Student, vollerName, matrNr):
        Student.name = vollerName
        Student.matrikelnummer = matrNr
        Student.scheine = 0

    def gibName(Student):
        return Student.name

    def nameAendern(Student, neuerName):
        Student.name = neuerName

    def gibMatrikelnummer(Student):
        return Student.matrikelnummer

    def erhoeheScheinanzahl(Student, weitereScheine):
        Student.scheine = Student.scheine + weitereScheine

    def gibScheinanzahl(Student):
        return Student.scheine

    def gibLoginName(Student):
        return Student.name , Student.matrikelnummer

    def ausgeben(Student):
        print Student.name, Student.matrikelnummer
ich habe ein Projekt von java in python umgewandelt. Das Problem ist, dass ich alles von Klasse Student als Parameter in die Funktion def trageStudentEin haben will. Ich will auch noch die Funktion ausgeben() von Klasse Student in der Klasse Laborkurs aufrufen. Was soll ich nun verändern??
z.B : kurs1 = Laborkurs(3)
student1 = Student("marcel", "1")
kurs1.trageStudentEin(student1)
kurs1.listeAusgeben()
## hier soll alles auch von student1 erscheinen
studen2 = Student("max", "2")
kurs1.trageStudentEin(student2)
kurs1.listeAusgeben()
## hier soll alles auch von student1 und studen2 erscheinen
BlackJack

Montag 24. November 2008, 22:41

Bitte diesen Artikel lesen: Pythin Is Not Java, und den Python Style Guide, das Programm entsprechend ändern, und dann bei Fragen mit schönerem *Python*-Quelltext wiederkommen. Java-Quelltext der sich nur als Python-Quelltext verkleidet, ist hier nicht so gern gesehen. ;-)
tieuquay
User
Beiträge: 12
Registriert: Samstag 26. Juli 2008, 08:19

Montag 24. November 2008, 22:49

danke :D aber kannst du mir trotzdem helfen dieses problem zu lösen??? bitte !!!!
dass ich alles von Klasse Student als Parameter in die Funktion def trageStudentEin haben will. Ich will auch noch die Funktion ausgeben() von Klasse Student in der Klasse Laborkurs aufrufen.
BlackJack

Montag 24. November 2008, 23:11

Ich sehe jetzt ehrlich gesagt das Problem nicht so ganz!?

Beim ersten verstehe ich die Frage nicht. Du übergibst doch ganze Studenten an die Methode.

Und beim zweiten: Schreib eine Schleife die auf jedem Studenten die `ausgeben()`-Methode aufruft.

Aber wie gesagt, sieht das aus Python-Sicht nicht nach schönem Quelltext aus. Die ganzen "Getter" und "Setter" kannst Du Dir sparen.

Statt die Attribute vom Kurs in der `__init__()` vorzubelegen, solltest Du Default-Parameter benutzen, damit man die Möglichkeit erhält einen Kurs mit einem Aufruf auch komplett mit Daten zu befüllen.

Anstelle von Methoden zum Ausgeben wäre eine `__str__()`-Methode besser (entspricht `toString()` in Java), dann kann man die Objekte einfach mit ``print`` ausgeben.

Eine "pythonischere" Umsetzung:

Code: Alles auswählen

NN = 'N.N.'


class CourseError(Exception):
    pass


class LabCourse(object):
    def __init__(self, max_students, lecturer=NN, room=NN, day_and_time=NN):
        self.lecturer = lecturer
        self.room = room
        self.day_and_time = day_and_time
        self.max_students = max_students
        self.students = list()
    
    def __len__(self):
        return len(self.students)
    
    def __iter__(self):
        return iter(self.students)
    
    def __str__(self):
        return ('Laborkurs: %s\n'
                'Dozent: %s   Raum: %s\n'
                'Teilnehmerliste:\n'
                '%s\n'
                'Teilnehmeranzahl %d' % (self.day_and_time,
                                         self.lecturer,
                                         self.room,
                                         '\n'.join(map(str, self)),
                                         len(self)))
    
    def add_student(self, student):
        if len(self) >= self.max_students:
            raise CourseError('course full')
        self.students.append(student)


class Student(object):
    def __init__(self, name, matriculation_nr):
        self.name = name
        self.matriculation_nr = matriculation_nr
        self.credits = 0
    
    def __str__(self):
        return '%s (MatNr. %s)' % (self.name, self.matriculation_nr)


def main():
    course = LabCourse(3)
    course.add_student(Student('marcel', 1))
    print course
    print
    course.add_student(Student('max', 2))
    print course


if __name__ == "__main__":
    main()
tieuquay
User
Beiträge: 12
Registriert: Samstag 26. Juli 2008, 08:19

Dienstag 25. November 2008, 00:00

Danke für die "pythonischere" Umsetzung :mrgreen:
Antworten