Seite 1 von 1

Funktion zur automatischen Objektinitaliserung

Verfasst: Freitag 7. Oktober 2011, 10:01
von 1st.try
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!

Re: Funktion zur automatischen Objektinitaliserung

Verfasst: Freitag 7. Oktober 2011, 10:04
von Defnull
Wenn du durchnummerierte Variablen verwendest, machst du etwas grundlegendes falsch. Was willst du denn eigentlich tun?

Re: Funktion zur automatischen Objektinitaliserung

Verfasst: Freitag 7. Oktober 2011, 10:07
von 1st.try
Hi!
erstmal danke für die schnelle Antwort!

Ich möchte Objekte erzeugen deren Namen die beiden Indizes i und k enthalten.

Re: Funktion zur automatischen Objektinitaliserung

Verfasst: Freitag 7. Oktober 2011, 10:18
von Defnull
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)  


Re: Funktion zur automatischen Objektinitaliserung

Verfasst: Freitag 7. Oktober 2011, 10:26
von 1st.try
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...

Re: Funktion zur automatischen Objektinitaliserung

Verfasst: Freitag 7. Oktober 2011, 10:27
von Defnull
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)]

Re: Funktion zur automatischen Objektinitaliserung

Verfasst: Freitag 7. Oktober 2011, 10:32
von 1st.try
Danke! ja das ist super das bringt mich erstmal weiter.

Re: Funktion zur automatischen Objektinitaliserung

Verfasst: Freitag 7. Oktober 2011, 10:49
von 1st.try
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 ?