Seite 1 von 1

Klassen Definition soll Liste ausgeben

Verfasst: Sonntag 28. März 2021, 10:46
von gomez72
Hallo zusammen,

ich bin in meinen Anfängen und komme an einer Stelle alleine nicht weiter. Durch diverse Suchanfragen konnte ich mein Problem leider nicht finden.
Es ist sicher eine triviale Lösung :(

Ich möchte einen Aussaht Kalender entwickeln. Meine spezifischen Gemuese Sorten, die ich dann pflanze und ernte sind Instanzen einer Gemüse Klasse.
Ich bin noch nicht so weit, um mit Python eine Datenbank anzusprechen, deswegen möchte ich meine Daten erstmal in einer Python Liste speichern. Das würde mir für´s erste reichen.

Jetzt zu meinem Problem:
In einer Datei classlist.py habe ich meine Gemuese Klasse definiert und speichere auch dort die Gemüse Eigenschaften innerhalb einer Liste.

Code: Alles auswählen

Knoblauch = ["Knoblauch", "lockerer Boden, humusreich", "Mischkultur"]
Ich erzeuge in der main.py eine Instanz der Klasse gemuese, wie zum Beispiel

Code: Alles auswählen

knoblauch = Gemuese("Knoblauch")
und übergebe dabei den String "Knoblauch"

Nun soll eine Klassen Funktion der Gemüse Klasse die Eigenschaften des Gemüses ausgeben.
Ich hole mir den string "Knoblauch" aus dem Aufruf aus der main.py und möchte diesen dann in der Funktion

Code: Alles auswählen

    def definition_ausgeben(self):
        print(self.gemuese_name)
dazu verwenden die vorher definierte Liste auszugeben.
Hier ist mein Problem: durch diesen Funktionsaufruf wird mir nur der String "Knoblauch" ausgegeben, aber nicht die gespeicherten Inhalte der "Knoblauch-Liste.
Ich möchte in der Funktion nicht explizit die Liste Knoblauch direkt angeben müssen (was wunderbar klappen würde, schon getestet), weil ich sonst den Code immer wieder spezifisch erweitern müsste, wenn ein Gemüse dazukommt. Ich schätze das wäre auch ein schlechter Programmierstil. :(


hier meine beiden vollständigen py Dateien
main. py

Code: Alles auswählen

from classlist import Gemuese

knoblauch = Gemuese("Knoblauch")
knoblauch.definition_ausgeben()
classlist.py

Code: Alles auswählen

Knoblauch = ["Knoblauch", "lockerer Boden, humusreich", "Mischkultur"]


class Gemuese:
    def __init__(self, gemuese_name):
        self.gemuese_name = gemuese_name
        print("Der " + gemuese_name + " wurde in die Satliste aufgenommen")
    def definition_ausgeben(self):
        print(self.gemuese_name)
    def aussaht(self):
        print("Der " + self.gemuese_name + " wird ausgesäht")
Ich würde mich sehr freuen, wenn mir jemand auf die Sprünge helfen kann.

Re: Klassen Definition soll Liste ausgeben

Verfasst: Freitag 16. April 2021, 09:45
von GabrielleChanel
Hallo, ich habe mir kurz dein Code angeguckt.
An zwei Stellen steht bei dir "Knoblach". Beim Zugreifen, greifst du jeweils nicht wie gewünscht auf deine "Knoblauch-Liste" in classlist.py, sondern auf den String "Knoblauch" in main.py (du kannst beispielsweise "knoblauch" klein schreiben, dann siehst du dass du auf diesen String zugreifst). Deswegen erhälst du auch ein NameError, weil es sich um zwar mit "Knoblauch" um den gleichen wörtlichen Inhalt, aber um eine andere Variable, handelt. In main.py enthält der String nur "Knoblauch" also kannst du gar nicht auf mehr Information zugreifen, weil es an dieser Stelle nichts mehr gibt. Wenn du jedoch auf die Liste zugreifen kannst, dann kannst du dann in einem weiteren Schritt das erste Wort überspringen, also eine Ausgabe der Liste ohne das erste Argument generieren.

Und ein weiterer Punkt und Tipp zugleich: Ich würde in deiner "classlist.py" in "definition_ausgeben()" und "aussaht()" statt "print()" ein "return" verwenden und dafür in "main.py" "print(knoblauch.definition_ausgeben())" oder diese in eine Zwischenvariable (z.b. "my_gemuese_wahl = knoblauch.definition_ausgeben()") speichern und dann "print(my_gemuese_wahl)" anwenden.

PS. Ich fühle mich leider selber noch Programmieranfängerin, aber ich hoffe, dass ich dir dennoch irgendwie helfen konnte.

Re: Klassen Definition soll Liste ausgeben

Verfasst: Freitag 16. April 2021, 12:20
von Sirius3
@GabrielleChanel: Das ist ein Doppelpost.