Variable in Klasse dynamisch ansprechen

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
oml221
User
Beiträge: 7
Registriert: Mittwoch 7. Oktober 2020, 20:38
Wohnort: Quito, Ecuador

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! :-)
Benutzeravatar
snafu
User
Beiträge: 6872
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Deine Klassenvariablen nennen sich Instanzattribute. ;)

Wenn du sie dynamisch ändern willst:

Code: Alles auswählen

for name in attr_names:
    setattr(obj, name, value)
Benutzeravatar
sparrow
User
Beiträge: 4540
Registriert: Freitag 17. April 2009, 10:28

@oml221: Schau dir neben setattr() auch einmal hasattt() und getattr() an, die das Bild quasi vervollständigen.
Sirius3
User
Beiträge: 18275
Registriert: Sonntag 21. Oktober 2012, 17:20

Warum willst du das machen? Warum benutzt du nicht einfach ein Wörterbuch?
oml221
User
Beiträge: 7
Registriert: Mittwoch 7. Oktober 2020, 20:38
Wohnort: Quito, Ecuador

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.
Sirius3
User
Beiträge: 18275
Registriert: Sonntag 21. Oktober 2012, 17:20

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.
oml221
User
Beiträge: 7
Registriert: Mittwoch 7. Oktober 2020, 20:38
Wohnort: Quito, Ecuador

@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 :-)
Benutzeravatar
__blackjack__
User
Beiträge: 14067
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@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.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Benutzeravatar
snafu
User
Beiträge: 6872
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

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...?
Antworten