Seite 1 von 1

Variable in Klasse dynamisch ansprechen

Verfasst: Mittwoch 18. Januar 2023, 03:34
von oml221
Hallo Zusammen,

ich möchte eine Klassenvariable dynamisch zuweisen, finde aber keinen Weg das zu machen.

Beispiel ich habe eine Klasse und eine Liste:

Code: Alles auswählen

class BEISPIEL:
	def __init__(self):
		self.VAR1 = ""
		self.VAR2 = ""
		self.VAR3 = ""
		
		
liste = ["VAR1", "VAR2", "VAR3"]

Nun möchte ich durch die Liste gehen und von dort die Klassenvariablen holen und irgendwas in diese Variable schreiben

Code: Alles auswählen

tmp_class = BEISPIEL()
for i in liste:
	# i hat jetzt ja einmal "VAR1", dann "VAR2" und dann "VAR3"
	tmp_class.WERT_VON_i = "irgendwas"
wenn ich tmp_class.i schreibe, legt Python mir eine neue Variable i an, ich wollte aber die existierende Variable ansprechen.

Geht das in Python irgendwie?
Vorab vielen Dank für eure Hilfe! :-)

Re: Variable in Klasse dynamisch ansprechen

Verfasst: Mittwoch 18. Januar 2023, 05:41
von snafu
Deine Klassenvariablen nennen sich Instanzattribute. ;)

Wenn du sie dynamisch ändern willst:

Code: Alles auswählen

for name in attr_names:
    setattr(obj, name, value)

Re: Variable in Klasse dynamisch ansprechen

Verfasst: Mittwoch 18. Januar 2023, 06:19
von sparrow
@oml221: Schau dir neben setattr() auch einmal hasattt() und getattr() an, die das Bild quasi vervollständigen.

Re: Variable in Klasse dynamisch ansprechen

Verfasst: Mittwoch 18. Januar 2023, 06:43
von Sirius3
Warum willst du das machen? Warum benutzt du nicht einfach ein Wörterbuch?

Re: Variable in Klasse dynamisch ansprechen

Verfasst: Mittwoch 18. Januar 2023, 14:56
von oml221
setattr() war genau wonach ich gesucht habe.
hasattt() / getattr() wäre dann meine nächste Frage gewesen :)

Vielen lieben Dank an euch!



@Sirius3
Mir ging es hier wirklich darum Instanzattribute (Klassenvariablen :lol: ) zu verändern.
Damit ich damit etwas besser umgehen kann.
Aber danke für deinen Tipp.

Re: Variable in Klasse dynamisch ansprechen

Verfasst: Mittwoch 18. Januar 2023, 16:06
von Sirius3
Es ist meist nicht sinnvoll, Instanzattribute dynamisch zu verändern. Darum die Frage, warum Du das machen möchtest, weil es fast immer eine bessere Lösung dafür gibt.

Re: Variable in Klasse dynamisch ansprechen

Verfasst: Mittwoch 18. Januar 2023, 20:47
von oml221
@Sirius3
Ich programmiere sein 15 Jahren mit einer sehr alten Programmiersprache (Zeileninterpreter) für ein ERP System (hat mehrere tausen Kunden, ist also nicht so klein).

In dieser "Programmiersprache" gibt es weder Dict, noch Listen und schon gar keine Klassen.
Man kann sich eine Liste in einen String "bauen", solange der String dann nicht länger als 2000 Zeichen wird.
Man ist also sehr eingeschränkt - aber es funktioniert seit jahrzehnten tadellos.


Wenn ich aber sehr große Datenmengen (z.B. 100.000 Artikel) nach bestimmten Kriterien auswerten möchte, läuft das Programm mehrere Minuten (ich muss immer wieder Daten in Dateien auslagern).
Daher experimentiere ich seit geraumer Zeit mit Python. Da geht es ja pfeilschnell!!

Warum will ich nun Instanzattribute dynamisch zuweisen?
Ich habe ein Programm, welches mir aus dem ERP System alle Variablen vom Artikel inkl. deren Wert in eine Datei schreibt. z.B. nummer:4711 # name:Testteil # weitere_Variable:Wert_der Variable #.....

Aktuell muss ich in Python immer dieselben Variablen in der Klasse anlegen und dann im Programm hart coden.
Ich wollte aber einfach die Datei einlesen und dann schauen, ob es z.B. eine Variable "nummer" in der Klasse ARTIKEL gibt und diese dann mit 4711 setzen. Wenn nicht, lege ich diese an.

So spare ich mir das doppelte coden (was ja auch zu vielen Fehlern führt).

Ich finde das Prinzip der Klassen perfekt um z.B. meine Artikeldatenbank oder Lieferanten 1:1 abzubilden.
Vermutlich könnte ich hierzu auch ein Dict verwenden, aber ich habe immer noch Probleme mit verschachtelten Daten
z.B. {4711:[{nummer:4711},{name:Testteil},.....], 0815:[............]} Ich finde hier die Klassen einfach "logischer" bzw. anschaulicher.

Wenn du aber meinst, das ein Dict hier viel besser wäre, lasse ich mich sehr, sehr gerne belehren und versuche mir in dieser Richtung weiteres Wissen anzueigen.

Freue mich über deine Meinung :-)

Re: Variable in Klasse dynamisch ansprechen

Verfasst: Mittwoch 18. Januar 2023, 21:57
von __blackjack__
@oml221: Ich würde sagen Klassen sind geeigneter für diesen Zweck, stelle aber das dynamische Zuweisen in Frage, denn Klassen bedeuten feste Attribute, die der Programmierer tatsächlich explizit hin schreibt, und nicht Attribute die dynamisch erstellt werden. Weil dafür Klassen nicht gedacht sind. Das wäre was für Wörterbücher. Die sind aber eigentlich das falsche Mittel wenn der Satz an Schlüsseln immer der gleiche ist. Weil das eher was für Klassen ist.

Ich sehe auch nicht wo da irgend etwas zu vielen Fehlern führt. Im Gegenteil, wenn man die Datentypen definiert, hat man ja eher eine Möglichkeit Fehler zu finden, wenn sich die Daten irgendwo von diesen *festen* Definitionen unterscheiden.

Re: Variable in Klasse dynamisch ansprechen

Verfasst: Mittwoch 18. Januar 2023, 22:40
von snafu
Also mir ist das noch zu abstrakt formuliert, als dass ich wirklich verstehen würde, was das spezifische Problem ist. So ganz allgemein ist das JSON-Format halt immer ganz gut, wenn es um den Austausch reiner Daten geht. Vermutlich unterstützt die ominöse alte Programmiersprache das aber nicht. Vielleicht ist CSV eine Alternative...?