Geschweifte Klammern Ausgabe bei __repr__

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.
martin2p
User
Beiträge: 15
Registriert: Sonntag 22. Oktober 2023, 21:40

Hallo,

ich beschäftige mich mit dem Erlernen von Python und online finde ich zu meiner Problemstellung leider nix.
Die Forensuche hier hat auch nichts ergeben. Deshalb erstelle ich ein neues Thema weil ich einfach nicht weiter weiß.

Bei dieser Aufgabe von Codecademy gibt es keinen Lösungsweg/Video. Ich konnte die Aufgabe selbst soweit meistern, jedoch ist die Ausgabe noch fehlerhaft:

Code: Alles auswählen

class School:
    def __init__(self, name, level, numberOfStudents):
        self.name = name
        self.level = level
        self.numberOfStudents = numberOfStudents

    def getName(self):
        return self.name

    def getLevel(self):
        return self.level

    def getNumberOfStudents(self):
        return self.numberOfStudents

    def setNumberOfStudents(self, newNumberOfStudents):
        self.numberOfStudents = newNumberOfStudents

    def __repr__(self):
        return "A {level} school named {name} with {numberOfStudents} students. "


class PrimarySchool(School):
    def __init__(self, name, numberOfStudents, pickupPolicy):
        super().__init__(self, name, numberOfStudents)
        self.pickupPolicy = pickupPolicy

    def getPickupPolicy(self):
        return self.pickupPolicy

    def __repr__(self):
        parentRepr = super().__repr__()
        return parentRepr + "The pickup policy is {pickupPolicy}.".format(
            pickupPolicy=self.pickupPolicy
        )


class HighSchool(School):
    def __init__(self, name, numberOfStudents, sportsTeams):
        super().__init__(self, name, numberOfStudents)
        self.sportsTeams = sportsTeams

    def getSportsTeams(self):
        return self.sportsTeams

    def __repr__(self):
        parentRepr = super().__repr__()
        return parentRepr + "SportsTeams: ".format(pickupPolicy=self.sportsTeams)


######################################

a = School("Pleissa", "high", 100)
print(a)
print(a.getName())
print(a.getLevel())
a.setNumberOfStudents(200)
print(a.getNumberOfStudents())


b = PrimarySchool("Codecademy", 300, "Pickup Allowed")
print(b.getPickupPolicy())
print(b)

c = HighSchool("Codecademy High", 500, ["Tennis", "Basketball"])
print(c.getSportsTeams())
print(c)
Explizit geht es um:

Code: Alles auswählen

def __repr__(self):
        return "A {level} school named {name} with {numberOfStudents} students. "

Code: Alles auswählen

return parentRepr + "The pickup policy is {pickupPolicy}.".format(
            pickupPolicy=self.pickupPolicy
        )

Code: Alles auswählen

return parentRepr + "SportsTeams: ".format(pickupPolicy=self.sportsTeams)
In der Ausgabe erhalte ich nämlich bspw:
A {level} school named {name} with {numberOfStudents} students.
Die geschweiften Klammern werden also nicht ausgefüllt :(
Diese sind eine LösungsVorgabe und ich finde einfach nicht die Ursache. Kann mir jemand weiter helfen?

Gruß, Martin.
Benutzeravatar
__blackjack__
User
Beiträge: 14135
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@martin2p: Als erstes ganz klar und deutlich: Dafür `__repr__()` statt `__str__()` zu verwenden ist falsch. `__repr__()` soll eine Zeichenkettenrepräsentation liefern die bei beim Entwickeln für die Fehlersuche nützlich ist. Das ist per *sehr starker* Konvention entweder eine Zeichenkette die Quelltext darstellt, der wenn er ausgeführt wird ein wertgleiches Objekt erstellt, oder es sind Informationen in ”spitze Klammern” (<…>) eingefasst, die den Datentyp und eventuell noch andere Informationen enthalten.

Eine Zeichenkettenrepräsentation zur Ausgabe für Endnutzer wird mit der `__str__()`-Methode erstellt.

Dann ist das gezeigte ist kein Python. Das sieht aus als würde jemand versuchen eigentlich Java zu schreiben. Das fängt mit den Namensschreibweise an, in Python klein_mit_unterstrichen für alles ausser Konstanten (KOMPLETT_GROSS) und Klassen (PascalCase). Und geht mit trivialen gettern und settern weiter, die man in Python nicht schreibt, weil die Sprache Properties kennt (`property()`).

Wenn man sich `School.__repr__()` anschaut, was sollte denn dort dafür sorgen, dass die geschweiften Klammern durch irgendetwas ersetzt werden? In anderen `__repr__()`-Methoden wird dafür ja etwas *gemacht*. Wobei `format()` nicht wirklich sinnvoll ist, wenn man stattdessen f-Zeichenkettenliterale verwenden kann.

Die Zeichenkettendarstellung von `School` sollte am Ende kein unnötiges Leerzeichen enthalten. Wenn eine abgeleitete Klasse das braucht, dann ist *die* dafür zuständig.

`a`, `b`, und `c` sind keine sinnvollen Namen für School-Objekte.

Und das ganze funktioniert nicht weil die abgeleiteten Klassen die `__init__()` der Elternklasse nicht mit den richtigen Argumenten aufruft.

Den Fehler bzw. dessen Behebung in den `__init__()`-Methoden habe ich mal nicht mit drin:

Code: Alles auswählen

#!/usr/bin/env python3


class School:
    def __init__(self, name, level, number_of_students):
        self.name = name
        self.level = level
        self.number_of_students = number_of_students

    def __str__(self):
        return f"A {self.level} school named {self.name} with {self.number_of_students} students."


class PrimarySchool(School):
    def __init__(self, name, number_of_students, pickup_policy):
        super().__init__(...)
        self.pickup_policy = pickup_policy

    def __str__(self):
        return (
            f"{super().__str__()} The pickup policy is {self.pickup_policy}."
        )


class HighSchool(School):
    def __init__(self, name, number_of_students, sports_teams):
        super().__init__(...)
        self.sports_teams = sports_teams

    def __str__(self):
        #
        # TODO Hier möchte man die Sport-Teams vielleicht nicht als
        #   Zeichenkettendarstellung einer Liste haben.
        #
        return f"{super().__str__()} SportsTeams: {self.sports_teams}."


def main():
    school = School("Pleissa", "high", 100)
    print(school)
    print(school.name)
    print(school.level)
    school.number_of_students = 200
    print(school.number_of_students)

    school = PrimarySchool("Codecademy", 300, "Pickup Allowed")
    print(school.pickup_policy)
    print(school)

    school = HighSchool("Codecademy High", 500, ["Tennis", "Basketball"])
    print(school.sports_teams)
    print(school)


if __name__ == "__main__":
    main()
“It is easier to change the specification to fit the program than vice versa.” — Alan J. Perlis
martin2p
User
Beiträge: 15
Registriert: Sonntag 22. Oktober 2023, 21:40

Hallo Blackjack,

zunächste erstmal vielen Dank für deine Antwort!
Leider bestätigst du für Python quasi das gleiche wie mein Bruder für C# wenn es um Quellcode und Aufgabenstellung von Codecademy geht: Verbesserungswürdig.

Nun bin ich etwas frustriert, es wirkt mal wieder als würde dieser Verein aus New York das Pferd von hinten aufzäumen wollen.
Die property() - Methode wurde nach dieser Aufgabe mit der Schule kurz umrissen.

Sinn der Aufgabe war es wohl nochmal die 4 Säulen von OOP (Inheritance, Polymorphism, Abstraction und Encapsulation) per Coding zu verinnerlichen. Es ist Teil des "Learn Intermediate Python 3" - Kurses, nur fühl ich mich noch immer net fortgeschritten :roll: , ich muss mich nach einer anderen Lernmöglichkeit umsehen.

####################################################

Nachdem ich __repr__() durch __str__() ersetzt habe und dieses kleine f vor den Anführungszeichen des Texts gesetzt habe meckert mein Editor nun rum, dass "level", "name" und "numberOfStudents" nicht gegeben/undefiniert sind. Liegt der Grund darin, dass diese im Konstruktor liegen und somit nur local verfügbar sind?

Also dass die __str__() Methode nicht darauf zugreifen kann?

Wenn ich die Variablen in die __str__ Method einfüge verwindet die Meldung, dafür bekomme ich nun einen Type-Error, trotz dass ich numberOfStudents in int() umwandel:

Code: Alles auswählen

def __str__(self, level, name, numberOfStudents):
        return (
            f"A {level} school named {name} with"
            + int(numberOfStudents)
            + " students. "
        )
School hat ja 3 Argumente:

Code: Alles auswählen

School = School("Pleissa", "high", 100)
print(School)

Code: Alles auswählen

 print(School)
TypeError: School.__str__() missing 3 required positional arguments: 'level', 'name', and 'numberOfStudents'
PS C:\Users\Martin\VisualStudio_C> 
Benutzeravatar
noisefloor
User
Beiträge: 4209
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

schau' dir nochmal genau an, was __blackjack__ in seinem Code stehe hat und was du drin hast. Das ist ziemlich anders.

1. Brauchst du an __str__ keine Argument außer _self übergeben.
2. Greift man auf Attribute der Klasse innerhalb der Klasse mit `self.name_des_attributs` zu.

Zum Lernen: Es ist immer eine gute Idee, das Python-Tutorial https://docs.python.org/3/tutorial/index.html mal durchzuarbeiten.

Gruß, noisefloor
Benutzeravatar
__blackjack__
User
Beiträge: 14135
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@martin2p: „intermediate“ ist ja noch nicht „advanced“. Also musst Du Dich noch nicht als Fortgeschrittener fühlen. 🙂

Wie gesagt sieht es für mich eher nach Java aus. Zumindest „encapsulation“ wird halt in Python eher informell gelöst und nicht mit Syntax oder Code. Man greift einfach nicht auf Innereien von anderen Objekten zu, auch wenn man es könnte. OOP-Lehrende sehen das leider oft so das man Kapselung auch irgendwie hart durchsetzen muss, mit Sprachmitteln, also ”private”, was Python nun mal nicht hat, oder zumindest mit trivialen Gettern/Settern, was aber in Python unüblich ist. Denn man kann wenn man die Art des Zugriffs mal ändern möchte, später immer noch ein Property daraus machen, ohne das sich Client-Code ändern muss.

Natürlich bekommst Du einen TypeError wenn Du versuchst eine Zeichenkette und eine Zahl zu addieren. Was sollte denn dabei auch heraus kommen? Aber wenn Du sowieso schon eine f-Zeichenkette verwendest, warum dann plötzlich noch Addition/Verkettung mit ``+``?

Das man das `self` in Methoden zwingend verwenden muss um auf Attribute zuzugreifen sollte schon vor Vererbung klar geworden sein. Es gibt in Python ja sonst keine Möglichkeit zwischen lokalen Variablen und Attributen zu unterscheiden, weil die Attribute ja nicht deklariert werden.
“It is easier to change the specification to fit the program than vice versa.” — Alan J. Perlis
martin2p
User
Beiträge: 15
Registriert: Sonntag 22. Oktober 2023, 21:40

Hallo,

sorry ich hatte nach der Arbeit den Code von Blackjack nicht richtig durchgeschaut.
Die Anpassungen habe ich nun vorgenommen. Ich dachte halt, dass auch wenn es lokal im Konstruktor liegt, andere Funktionen auf gleicher Ebene trotzdem Zugriff darauf haben, aber da hatte ich mich geirrt.

Ich erhalte nun noch die Fehlermeldung:

[....] (gekürzt
File "c:\Users\Martin\VisualStudio_C\Python\OOP\Aufgabe.py", line 32, in __str__
return f"{super().__str__()} The pickup policy is {self.pickup_policy}."
^^^^^^^^^^^^^^^^^
File "c:\Users\Martin\VisualStudio_C\Python\OOP\Aufgabe.py", line 20, in __str__
return f"A {self.level} school named {self.name} with {self.number_of_Students} students. "
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "c:\Users\Martin\VisualStudio_C\Python\OOP\Aufgabe.py", line 32, in __str__
return f"{super().__str__()} The pickup policy is {self.pickup_policy}."
^^^^^^^^^^^^^^^^^
RecursionError: maximum recursion depth exceeded
Vielen Dank für den Link @ noisefloor :)
Sirius3
User
Beiträge: 18299
Registriert: Sonntag 21. Oktober 2012, 17:20

Bitte zeige Deinen vollständigen Code, so kann man ja nicht sehen, was Du falsch gemacht hast.
Benutzeravatar
__blackjack__
User
Beiträge: 14135
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@martin2p: Das ist immer noch der Fehler das Du falsche Werte bei den `__init__()`-Aufrufen übergibst.
“It is easier to change the specification to fit the program than vice versa.” — Alan J. Perlis
Sirius3
User
Beiträge: 18299
Registriert: Sonntag 21. Oktober 2012, 17:20

@__blackjack__: stimmt.

@martin2p: Du übergibst als erstes Argument für den `name` `self`, und bekommst daher bei der Ausgabe eine Endlos-Rekursion, wenn du versuchst name (aka self) in einen String umzuwandeln.
martin2p
User
Beiträge: 15
Registriert: Sonntag 22. Oktober 2023, 21:40

Hej jetzt funktioniert es!

Ja der Fehler war bei der Vererbung das self nochmal mit rein zu nehmen.

Hier der Code wie er funktioniert:

Code: Alles auswählen

class School:
    def __init__(self, name, level, number_of_Students):
        self.name = name
        self.level = level
        self.number_of_Students = number_of_Students

    def getName(self):
        return self.name

    def getLevel(self):
        return self.level

    def getnumber_of_Students(self):
        return self.number_of_Students

    def setnumber_of_Students(self, new_number_of_Students):
        self.number_of_Students = new_number_of_Students

    def __str__(self):
        return f"A {self.level} school named {self.name} with {self.number_of_Students} students. "


class PrimarySchool(School):
    def __init__(self, name, number_of_Students, pickup_policy):
        super().__init__(name, number_of_Students, pickup_policy)
        self.pickup_policy = pickup_policy

    def getpickup_policy(self):
        return self.pickup_policy

    def __str__(self):
        return f"{super().__str__()} The pickup policy is {self.pickup_policy}."


class HighSchool(School):
    def __init__(self, name, number_of_Students, sports_teams):
        super().__init__(name, number_of_Students, sports_teams)
        self.sports_teams = sports_teams

    def getsports_teams(self):
        return self.sports_teams

    def __str__(self):
        return f"{super().__str__()} SportsTeams: {self.sports_teams}."


######################################

school = School("Pleissa", "high", 100)
print(school)
print(school.getName())
print(school.getLevel())
school.setnumber_of_Students(200)
print(school.getnumber_of_Students())


school = PrimarySchool("Codecademy", 300, "Pickup Allowed")
print(school.getpickup_policy())
print(school)

school = HighSchool("Codecademy High", 500, ["Tennis", "Basketball"])
print(school.getsports_teams())
print(school)


Eine Verständnisfrage habe ich noch zu den Subklassen:

Wie genau kommuniziert der Unterkonstruktor der von den Eltern erbt mit dem eigentlichen Konstruktor der Subklasse?

Beispiel hier:

Code: Alles auswählen

class PrimarySchool(School):
    def __init__(self, name, number_of_Students, pickup_policy):
        super().__init__(name, number_of_Students, pickup_policy)
        self.pickup_policy = pickup_policy
Ich verstehe bei diesem Beispiel nicht so richtig, warum so viele Werte doppelt aufgelistet sind um Python klar zu machen, dass es etwas erben soll.
martin2p
User
Beiträge: 15
Registriert: Sonntag 22. Oktober 2023, 21:40

Hier wird es zwar gut erklärt wie Verrerbung funktioniert aber auch nicht warum so viel doppelt geschrieben werden muss:

https://www.python-lernen.de/vererbung-python.htm
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Woher sonst sollen denn die Werte für den Konstruktor der Basisklasse kommen? Und welche Sprache macht es denn weniger umfangreich?
Sirius3
User
Beiträge: 18299
Registriert: Sonntag 21. Oktober 2012, 17:20

@martin2p: Du hast ja immer noch diese unsinnigen Getter und Setter drin. Jetzt, nachdem Du es besser weißt, wundere ich mich, warum Du das nicht sofort korrigierst?
Der Aufruf von super().__init__() ist immer noch falsch. Das sollte Dir eigentlich bei der Ausgabe sofort auffallen.
martin2p
User
Beiträge: 15
Registriert: Sonntag 22. Oktober 2023, 21:40

@ __deets__:

Achso nun verstehe ich:
Trotz dass die Subklasse aus der Elternklasse erbt, weiß der Subklassenkonstruktor quasi nicht automatisch, dass er die Werte vom Elternkonstruktor erben kann. Diese sind ja lokal im Elternkonstruktor gespeichert.
Dafür gibt es dann die "Extrainfo" , dass er sich die Werte von dort quasi ziehen muss. Ich hätte gedacht, dass man wenigstens diesen Hinweis sofort in den Konstruktor einbaut um Code zu sparen.

Quasi so:

Code: Alles auswählen

def super().__init__(self, name, number_of_Students, pickup_policy):
Aber das funktioniert nicht ^^"

###############################################

@ Sirius3:

Was ist bei super().__init__() noch falsch?
In dem verlinktem Beispiel von python-lernen.de rufen die den r().__init__() doch auch so auf?

Code: Alles auswählen

class BauplanKatzenKlasse(Tier):
    """ Klasse für das Erstellen von Katzen """

    def __init__(self, rufname, farbe, alter):
        """ Initalisieren über Eltern-Klasse """
        super().__init__(rufname, farbe, alter)

Ich habe nun alle Getter und Setter raus genommen und erhalte nun den Fehler:

Code: Alles auswählen

Traceback (most recent call last):
  File "c:\Users\Martin\VisualStudio_C\Python\OOP\Aufgabe.py", line 53, in <module>
    school.number_of_Students(200)
TypeError: 'int' object is not callable
Sirius3
User
Beiträge: 18299
Registriert: Sonntag 21. Oktober 2012, 17:20

Warum willst Du auch eine Zahl aufrufen? Man setzt Attribute mit =.

Ich kann kaum glauben, dass jemand den Satz

Code: Alles auswählen

A 300 school named Codecademy with Pickup Allowed students.  The pickup policy is Pickup Allowed.
lesen kann und nicht merken, dass da etwas nicht stimmt.
martin2p
User
Beiträge: 15
Registriert: Sonntag 22. Oktober 2023, 21:40

Ich habe den Code dahingehen geändert dass alle Funktionen mit einem großen Buchstaben beginnen, ansonsten kam es zu falschen Verwendungen zwischen Funktion und Variablen.

Nun habe ich das Problem, dass ich die Anzahl der Schüler nicht ändern kann von 100 auf 200.

Code: Alles auswählen

A high school named Pleissa with 100 students. 
Pleissa
high
Traceback (most recent call last):
  File "c:\Users\Martin\VisualStudio_C\Python\OOP\Aufgabe.py", line 55, in <module>
    print(school.Number_of_Students())
          ^^^^^^^^^^^^^^^^^^^^^^^^^^^
TypeError: School.Number_of_Students() missing 1 required positional argument: 'new_number_of_Students'
Wieso erkennt er die 200 nicht als Argument an?
Wenn ich das new_number_students entferne bekomme ich dafür die Meldung:

Code: Alles auswählen

File "c:\Users\Martin\VisualStudio_C\Python\OOP\Aufgabe.py", line 54, in <module>
    school.Number_of_Students(200)
TypeError: School.Number_of_Students() takes 1 positional argument but 2 were given
Bin langsam völlig Banane :?

Code: Alles auswählen

class School:
    def __init__(self, name, level, number_of_Students):
        self.name = name
        self.level = level
        self.number_of_Students = number_of_Students

    def Name(self):
        return self.name

    def Level(self):
        return self.level

    def Number_of_Students(self, new_number_of_Students):
        return self.number_of_Students == new_number_of_Students
        
## alt Setter
##    def Number_of_Students(self, new_number_of_Students):
##       return self.number_of_Students == new_number_of_Students

    def __str__(self):
        return f"A {self.level} school named {self.name} with {self.number_of_Students} students. "


class PrimarySchool(School):
    def __init__(self, name, number_of_Students, pickup_policy):
        super().__init__(name, number_of_Students, pickup_policy)
        self.pickup_policy = pickup_policy

    def Pickup_policy(self):
        return self.pickup_policy

    def __str__(self):
        return f"{super().__str__()} The pickup policy is {self.pickup_policy}."


class HighSchool(School):
    def __init__(self, name, number_of_Students, sports_teams):
        super().__init__(name, number_of_Students, sports_teams)
        self.sports_teams = sports_teams

    def Sports_teams(self):
        return self.sports_teams

    def __str__(self):
        return f"{super().__str__()} SportsTeams: {self.sports_teams}."


######################################

school = School("Pleissa", "high", 100)
print(school)
print(school.Name())
print(school.Level())
school.Number_of_Students(200)
print(school.Number_of_Students())


school = PrimarySchool("Codecademy", 300, "Pickup Allowed")
print(school.Pickup_policy())
print(school)

school = HighSchool("Codecademy High", 500, ["Tennis", "Basketball"])
print(school.Sports_teams())
print(school)
martin2p
User
Beiträge: 15
Registriert: Sonntag 22. Oktober 2023, 21:40

Sirius3 hat geschrieben: Montag 23. Oktober 2023, 20:45 Warum willst Du auch eine Zahl aufrufen? Man setzt Attribute mit =.

Ich kann kaum glauben, dass jemand den Satz

Code: Alles auswählen

A 300 school named Codecademy with Pickup Allowed students.  The pickup policy is Pickup Allowed.
lesen kann und nicht merken, dass da etwas nicht stimmt.
Den Satzbau hat Codecademy so vorgegeben. Die reden im amerikanischem halt so :lol:
Sirius3
User
Beiträge: 18299
Registriert: Sonntag 21. Oktober 2012, 17:20

__blackjack__ hat Dir bereits den richtigen Code gezeigt, Du mußt also nur vergleichen, was Du anders gemacht hast. Methoden werden wie Variablen komplett klein geschrieben; es kann keine Verwechslung geben, weil Funktionen aufgerufen werden. Daran, dass Getter falsch sind, ändert sich nichts, auch wenn man das `get` wegläßt.

Dass der Text falsch ist, ist nur eine Folge davon, dass Du einen Programmierfehler beim Aufruf von super().__init__() hast.
martin2p
User
Beiträge: 15
Registriert: Sonntag 22. Oktober 2023, 21:40

Hallo.

Okay nun bekomme ich keine Errors mehr und ich habs fast hinbekommen! Der Fehler war die Position der Variablen und der Argumente!

Das meintet ihr mit super().__init__() oder???

Ausgabe

Code: Alles auswählen

A high school named Pleissa with 100 students. 
Pleissa
high
100
300
A primary school named Codecademy with 300 students.  The pickup policy is 300.
500
A High school named Codecademy with 500 students.  SportsTeams: 500.
Was jetzt noch fehlt ist die korrekte Ausgabe von:

SportsTeams: ["Tennis", "Basketball"]

und pickup policy is Pickup Allowed.

Vielleicht finde ich morgen den Fehler!
martin2p
User
Beiträge: 15
Registriert: Sonntag 22. Oktober 2023, 21:40

Ich habs geschafft!! Vielen Dank an eure Unterstützung!! Nun gehts frohen Mutes weiter auf dem steinigen Weg zum Programmierer :))))

Ich hab nun verstanden, dass in der super().__init__ wirklich nur die zu erbenden Eigenschaften aus der Elternklasse stehen dürfen. Sonst wirds Mist.
Neue Eigenschaften der jeweiligen Klasse kommen in den eigenen Kontruktor der jeweiligen Klasse.

Code: Alles auswählen

class School:
    def __init__(self, name, level, number_of_Students):
        self.name = name
        self.level = level
        self.number_of_Students = number_of_Students

    def __str__(self):
        return f"A {self.level} school named {self.name} with {self.number_of_Students} students. "


class PrimarySchool(School):
    def __init__(self, level, name, number_of_Students, pickup_policy):
        super().__init__(level, name, number_of_Students)
        self.pickup_policy = pickup_policy

    def __str__(self):
        return f"{super().__str__()} The pickup policy is {self.pickup_policy}."


class HighSchool(School):
    def __init__(self, level, name, number_of_Students, sports_teams):
        super().__init__(level, name, number_of_Students)
        self.sports_teams = sports_teams

    ##def Sports_teams(self):
    ##    return self.sports_teams

    def __str__(self):
        return f"{super().__str__()} SportsTeams: {self.sports_teams}."

######################################

school = School("Pleissa", "high", 100)
print(school)
print(school.name)
print(school.level)
school.number_of_Students = 200
print(school.number_of_Students)

school = PrimarySchool("Grundschule", "primary", 300, "Pickup Allowed")

print(school)

school = HighSchool("Gymnasium", "High", 500, ["Tennis", "Basketball"])

print(school)
Ausgabe:

Code: Alles auswählen

A high school named Pleissa with 100 students. 
Pleissa
high
200
A primary school named Grundschule with 300 students.  The pickup policy is Pickup Allowed.
A High school named Gymnasium with 500 students.  SportsTeams: ['Tennis', 'Basketball'].
Bis zum nächsten Rätsel! ;-)
Antworten