Klassenaufruf per String

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
afredo
User
Beiträge: 1
Registriert: Donnerstag 3. August 2023, 15:56

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
Benutzeravatar
sparrow
User
Beiträge: 4538
Registriert: Freitag 17. April 2009, 10:28

Wenn man Variablen durchnummeriert ist das ein deutlicher Hinweis darauf, dass man eigentlich eine Datenstruktur verwenden möchte. In diesem Fall eine Liste.
Benutzeravatar
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
Sirius3
User
Beiträge: 18274
Registriert: Sonntag 21. Oktober 2012, 17:20

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.

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()")
Benutzeravatar
__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.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Antworten