Funktion zur automatischen Objektinitaliserung

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
1st.try
User
Beiträge: 5
Registriert: Freitag 7. Oktober 2011, 09:42

Hallo zusammen!

Bei der Arbeit an meinem aktuellen Projekt bin ich auf folgendes Problem gestoßen, wäre cool wenn ihr mir dabei helfen könnt:

Ziel ist es ein Objekt mit variablen im Namen mit Hilfe einer Funktion zu erstellen.
Der Code sieht dazu folgendermaßen aus:

Code: Alles auswählen

#Definition der Klasse
class BasisFunction(object):

    def __init__(self, i, k):
....
vars()['N_'+str(i)+'_'+str(k)] = BasisFunction(i,k)

# Funktion soll Objekt mit Namen N_i_k erzeugen

def CreateBasisFunction(i,k):
    vars()['N_'+str(i)+'_'+str(k)] = BasisFunction(i,k)

...

# folgender Aufruf sollte dann z.B. das Objekt N_5_5 erzeugen
CreateBasisFunction(5,5)

Leider wird kein Objekt erstellt. Wenn ich den Befehl aus CreateBasisFunction in der main() Prozedur eingebe, also:

Code: Alles auswählen

i = 5
k = 5
vars()['N_'+str(i)+'_'+str(k)] = BasisFunction(i,k)
funktioniert das aber... Woran liegt das ? Wie kann ich den Fehler beheben/umgehen ?
Wäre super wenn mir jemand weiterhelfen könnte.

Schon mal vielen Dank!
Benutzeravatar
Defnull
User
Beiträge: 778
Registriert: Donnerstag 18. Juni 2009, 22:09
Wohnort: Göttingen
Kontaktdaten:

Wenn du durchnummerierte Variablen verwendest, machst du etwas grundlegendes falsch. Was willst du denn eigentlich tun?
Bottle: Micro Web Framework + Development Blog
1st.try
User
Beiträge: 5
Registriert: Freitag 7. Oktober 2011, 09:42

Hi!
erstmal danke für die schnelle Antwort!

Ich möchte Objekte erzeugen deren Namen die beiden Indizes i und k enthalten.
Benutzeravatar
Defnull
User
Beiträge: 778
Registriert: Donnerstag 18. Juni 2009, 22:09
Wohnort: Göttingen
Kontaktdaten:

1st.try hat geschrieben: Ich möchte Objekte erzeugen deren Namen die beiden Indizes i und k enthalten.
Geh noch mal eine Ebene höher. WARUM willst du Objekte erzeugen deren Namen die beiden Indizes i und k enthalten?

Kleiner Denkanstoß: Macht es nicht mehr Sinn, die Objekte in einer geeigneten Datenstruktur zu halten? z.B. einem dictionary?

Code: Alles auswählen

objects = {}
objects[1, 5] = SomeClass(1, 5)

def new_object(i, k):
    objects[i, k] = SomeClass(i, k)  

Zuletzt geändert von Defnull am Freitag 7. Oktober 2011, 10:26, insgesamt 1-mal geändert.
Bottle: Micro Web Framework + Development Blog
1st.try
User
Beiträge: 5
Registriert: Freitag 7. Oktober 2011, 09:42

Ah! Das ist schon mal ein guter Punkt.

Eigentlich sind mir die Namen egal. Ich möchte Quasi eine i x k Matrix mit hinterlegten Wertetabellen.
Also eher ein Objekt N(i,k) in dem Ich Werte setzten und auslesen kann...
Benutzeravatar
Defnull
User
Beiträge: 778
Registriert: Donnerstag 18. Juni 2009, 22:09
Wohnort: Göttingen
Kontaktdaten:

1st.try hat geschrieben:Eigentlich sind mir die Namen egal. Ich möchte Quasi eine i x k Matrix mit hinterlegten Wertetabellen.
Also eher ein Objekt N(i,k) in dem Ich Werte setzten und auslesen kann...
Das meine ich mit "was willst du eigentlich tun" ;) ich hab mein code-Beispiel oben mal entsprechend erweitert.

Wenn deine Matrix einigermaßen voll ist, würde ich eine verschachtelte liste statt einem dict nehmen:

Code: Alles auswählen

x, y = 5, 10
matrix = []
for i in range(x):
  matrix.append([])
  for k in range(y):
    matrix[i].append(SomeClass(i, k))

# matrix[4][8] enthält nun SomeClass(4, 8)
oder kürzer:

Code: Alles auswählen

matrix = [ [ SomeClass(i, k) for k in range(5)] for i in range(10)]
Zuletzt geändert von Defnull am Freitag 7. Oktober 2011, 10:35, insgesamt 2-mal geändert.
Bottle: Micro Web Framework + Development Blog
1st.try
User
Beiträge: 5
Registriert: Freitag 7. Oktober 2011, 09:42

Danke! ja das ist super das bringt mich erstmal weiter.
1st.try
User
Beiträge: 5
Registriert: Freitag 7. Oktober 2011, 09:42

Also ich hab das jetzt mal in mein Programm eingebaut. Leider bleibt weiterhin das Problem, das wenn ich das Objekt von der Funktion

Code: Alles auswählen

def CreateObject(i,k):
     N[i,k]=class(i,k)
erstellen lasse, kein Objekt erstellt wird. Nur wenn ich

Code: Alles auswählen

N[i,k]=class(i,k)
in main() wird auch wirklich ein Objekt erstellt. Woran liegt das ? Es wird doch egtl. beides mal das gleiche gemacht ?
Antworten