Seite 1 von 1

lokale Variablen

Verfasst: Dienstag 15. Februar 2005, 20:29
von kip
Hallo zusammen,

bin Neuling was python betrifft und wundere mich gerade darüber wie python lokale Variablen behandelt (naja, ist wahrscheinlich eher ein Denkfehler von mir ;)):

Ich habe eine Methode die ich nutze um über die Elemente eines XML-Dokuments zu iterieren, d.h. die ich öfters aufrufe.

Bei jedem Aufruf erzeuge ich eine Instanz eines Objekts, weise dem Objekt Werte zu und returne es dann.

Code: Alles auswählen

class a:
   def method:
      [...]
      foo = blah()
      [...]
      return foo
Mein Verständnis von OO-Programmierung sagt mir, dass die lokale Variable "foo" nach Ausführung von "method" verworfen wird und beim nochmaligen Aufruf von "method" ein neues Objekt von blah() erzeugt wird -> dies ist aber nicht der Fall :(.

Beim 2. und jedem weiteren Aufruf von method existiert das Objekt foo=blah() schon (es hat alle Werte des Objekts, die beim vorigen Aufruf von method zugewiesen wurden)

Kann mir das vllt. jemand erklären?

danke im voraus,
dennis

Edit (Leonidas): Code in Python Tags gesetzt.

Verfasst: Dienstag 15. Februar 2005, 21:14
von Beyond
Das sollte definitiv nicht so sein. Wenn es eine gleichnamige globale Variable gibt, gibt's imho einen Fehler. Wenn Du Variablen in Funktionsparameter initialisierst, dann bleiben sie allerdings die selben ...
Ein bischen mehr Code / das konkrete Beispiel, wäre hilfreich.

cu beyond

Verfasst: Dienstag 15. Februar 2005, 21:28
von kip
Hallo,

dann poste ich mal den kompletten Code, hier erstmal die Methode die ich öfters aufrufe:

Code: Alles auswählen

	def getNextItem(self):
		node = self.getNextNode()

		if node == None:
			return None
		
		item = dbitem()
		
		for n in self.atags:
			element = node.getElementsByTagName(n)
			if element.length > 0:
				child = node.getElementsByTagName(n)[0].firstChild
				if child != None and child.nodeType == xml.dom.Node.TEXT_NODE:
					item.setVal(n, child.data)
		
		return item
Das "Problemkind" ist die Variable item bzw. das Objekt dbitem() ...
Hier die dbitem-Klasse:

Code: Alles auswählen

class dbitem:
	data = {}
	
	def setVal(self, key, val):
		self.data[key] = val
		return
	
	def getVal(self, key):
		return self.data[key]
		
	def values(self, order):
		list = []
		for i in order:
			list.append(self.data[i])
		return list
	
	def valuesNoOrder(self):
		return self.data.values()
any ideas?

Edit (Leonidas): Code in Python Tags gesetzt.

Verfasst: Dienstag 15. Februar 2005, 21:36
von Dookie
Hi kip,

Code: Alles auswählen

class dbitem:
    data = {} # hier ist das Problem
   
    def setVal(self, key, val):
        self.data[key] = val
        return

    ....
data ist als Klassenvariable definiert und gilt so natürlich für alle Instanzen der Klasse und hat auch in allen Instanzen den gleichen Wert.

Code: Alles auswählen

class dbitem:
    
    def __init__(self):
        self.data = {} # data ist jetzt Instanzvariable
   
    def setVal(self, key, val):
        self.data[key] = val
        return
    
    ....
sollte das Problem beheben.


Gruß

Dookie

Verfasst: Dienstag 15. Februar 2005, 21:40
von kip
hallo,

vielen Dank, das hat in der Tat geholfen :)

gruss,
dennis