Ich habe eine Klasse "Laptop" erstellt, die sich in einem separaten Modul befindet. Inzwischen existieren 26 Instanzen, die ich folgendermaßen ausgeben kann:
laptop1.details()
laptop2.details()
usw.
Um nicht alle Instanzen einzeln aufrufen zu müssen, habe ich eine Schleifenkonstruktion probiert, die nicht funktioniert. Hier nun der Code:
import sys, os
current = os.path.dirname(os.path.realpath(__file__))
parent = os.path.dirname(current)
sys.path.append(parent)
from utils.classlib import Laptop
laptop1 = Laptop('HP1','AMD 64',5,16,700)
laptop2 = Laptop('HP2','AMD 64',5,16,700)
laptop1.details()
laptop2.details()
for i in range(1,3):
res = ""
res = "laptop"+str(i)+".details()"
print(res)
Und hier jetzt die Ausgabe:
The details of the laptop are:
Name : HP1
Processor : AMD 64
HDD Capacity : 5
RAM : 16
Cost : 700
The details of the laptop are:
Name : HP2
Processor : AMD 64
HDD Capacity : 5
RAM : 16
Cost : 700
laptop1.details()
laptop2.details()
Könnte mir jemand eine Tipp geben, wie das Problem gelöst werden kann?
Vielen herzlichen Dank.
Fredo
Klassenaufruf per String
- noisefloor
- User
- Beiträge: 4194
- Registriert: Mittwoch 17. Oktober 2007, 21:40
- Wohnort: WW
- Kontaktdaten:
Hallo,
das funktioniert auch so nicht. Du kannst ja nicht ein String zusammenbauen und dann hoffen, dass Python automagisch erkennt, dass es eine gleichnamige Klasse mit einer gleichnamigen Methode gibt.
Du müsstest dir eine Datenstruktur schaffen, in die du die Instanz der Klasse einpackst (z.B. eine Liste). Darüber kannst du dann iterieren. Wie und wo die Datenstruktur am besten liegt kommt auf deinen Gesamtcode an, kann man so pauschal nicht sagen.
Wenn im Beispiel deine reale Laptopklasse gezeigt ist, würde ich da eher mit Keyword-Argumenten statt Positionsargumenten. Wobei: wenn das wirklich alles ist, dann kann man das auch in eine Dict packen, ohne Klasse. Oder ggf. in eine DataClass. Und bei den Daten fehlen die Einheiten.
`os.path` ist veraltet, zum Umgang mit Pfaden ist `pathlib` Stand der Dinge. Und hat die bessere API.
Gruß, noisefloor
das funktioniert auch so nicht. Du kannst ja nicht ein String zusammenbauen und dann hoffen, dass Python automagisch erkennt, dass es eine gleichnamige Klasse mit einer gleichnamigen Methode gibt.
Du müsstest dir eine Datenstruktur schaffen, in die du die Instanz der Klasse einpackst (z.B. eine Liste). Darüber kannst du dann iterieren. Wie und wo die Datenstruktur am besten liegt kommt auf deinen Gesamtcode an, kann man so pauschal nicht sagen.
Wenn im Beispiel deine reale Laptopklasse gezeigt ist, würde ich da eher mit Keyword-Argumenten statt Positionsargumenten. Wobei: wenn das wirklich alles ist, dann kann man das auch in eine Dict packen, ohne Klasse. Oder ggf. in eine DataClass. Und bei den Daten fehlen die Einheiten.
`os.path` ist veraltet, zum Umgang mit Pfaden ist `pathlib` Stand der Dinge. Und hat die bessere API.
Gruß, noisefloor
sys.path ändert man nicht, richte Dein Environment so ein, dass Deine Module auch gefunden werden (normalerweise liegen die einfache im selben Verzeichnis und nicht im übergeordneten Verzeichnis).
`classlib` ist ein sehr seltsamer Modulname für eine Klasse, die Laptop heißt. Auch Module sollten aussagekräftig benannt sein, (das selbe gilt für utils).
res wird mit einem leeren String initialisiert, was aber niemals verwendet wird, kann also weg.
Strings stückelt man nicht mit + zusammen, sondern benutzt Formatstrings.
`classlib` ist ein sehr seltsamer Modulname für eine Klasse, die Laptop heißt. Auch Module sollten aussagekräftig benannt sein, (das selbe gilt für utils).
res wird mit einem leeren String initialisiert, was aber niemals verwendet wird, kann also weg.
Strings stückelt man nicht mit + zusammen, sondern benutzt Formatstrings.
Code: Alles auswählen
from inventory import Laptop
laptops = [
Laptop('HP1','AMD 64',5,16,700),
Laptop('HP2','AMD 64',5,16,700),
]
for laptop in laptops:
laptop.details()
for i in range(1, 3):
print(f"laptop{i}.details()")
- __blackjack__
- User
- Beiträge: 14053
- Registriert: Samstag 2. Juni 2018, 10:21
- Wohnort: 127.0.0.1
- Kontaktdaten:
Wenn man ein Programm auf Module aufteilt, sollte man die üblicherweise auch in einem Package zusammenfassen, damit nur *ein* Name mit allen anderen Modulen/Packages in der Standardbibliothek und was sonst noch so installiert ist, in Konkurrenz steht.
Die Frage ist hier auch ob das überhaupt auf Module aufgeteilt werden muss. So schnell erreicht man ja als Anfänger keine Programmgrössen die das rechtfertigen.
`details()` ist kein guter Methodenname, weil der keine Tätigkeitbeschreibt. Das tun Funktions- und Methodennamen üblicherweise, damit man a) weiss was die tun, und man sie b) leichter von eher passiven Werten unterscheiden kann. Also hier beispielsweise `print_details()`.
Von einem Wörterbuch statt einer Klasse würde ich abraten, weil Wörterbücher die immer einen festen Satz an Schlüsseln haben, eigentlich Objekte sind.
Die Frage ist hier auch ob das überhaupt auf Module aufgeteilt werden muss. So schnell erreicht man ja als Anfänger keine Programmgrössen die das rechtfertigen.
`details()` ist kein guter Methodenname, weil der keine Tätigkeitbeschreibt. Das tun Funktions- und Methodennamen üblicherweise, damit man a) weiss was die tun, und man sie b) leichter von eher passiven Werten unterscheiden kann. Also hier beispielsweise `print_details()`.
Von einem Wörterbuch statt einer Klasse würde ich abraten, weil Wörterbücher die immer einen festen Satz an Schlüsseln haben, eigentlich Objekte sind.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari