Probleme mit Konstruktor oder Referenz? kp

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
Pretender2k
User
Beiträge: 27
Registriert: Freitag 23. Januar 2009, 18:23

Hallo ich hab folgendes Problem:

Code: Alles auswählen

class test:
	def __init__(self):
		
		self.new = 0
		self.old = 0
		
	def function(self, value):
		self.new = value		
		print self.new
		print self.old
		self.old = self.new


def main(value):
	blub = test()
	blub.function(value)
Die Ausgabe ist:

Code: Alles auswählen

In [258]: main(22)
22
0

In [259]: main(21)
21
0
Das Beim ersten mal self.old = 0 ist passt ja. Aber beim zweiten mal sollte es dan doch bitte 22 sein. Wat mach ich falsch? was treibt eigentlich diese __init__() methode? Ich dachte, die legt mir beim anlegen einer Instanz initial Werte fuer Variablen fest. Das macht die aber hoffentlich nicht bei jedem aufruf oder?
Barabbas
User
Beiträge: 349
Registriert: Dienstag 4. März 2008, 14:47

Naja, du erstellst mit jedem Aufruf von main() eine neue Instanz von test mit eigenen Attributen. Darum hat die zweite Instanz von test auch keine Verbindung zum Wert "old" der ersten Instanz von test.

Falls du tatsächlich unbedingt mehrere Instanzen von test benötigst und das mit dem old-Wert unumgänglich ist, könntest du mal nach dem Stichtwort "Klassenattribut" suchen: Damit kannst du bestimmte Attribute definieren, die sich alle Instanzen einer Klasse teilen.

Aber prinzipiell sieht das eher so aus, als würdest du nicht den besten Weg gehen. Was genau möchtest du denn machen?

//edit:
versuche einfach mal folgendes:

Code: Alles auswählen

blubb = test()
blubb.function(30)
blubb.function(40)
Das ist vermutlich schon eher was du möchtest.
Zuletzt geändert von Barabbas am Mittwoch 4. August 2010, 13:36, insgesamt 1-mal geändert.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Pretender2k hat geschrieben:Aber beim zweiten mal sollte es dan doch bitte 22 sein. Wat mach ich falsch? was treibt eigentlich diese __init__() methode? Ich dachte, die legt mir beim anlegen einer Instanz initial Werte fuer Variablen fest. Das macht die aber hoffentlich nicht bei jedem aufruf oder?
Du erstellst ja 2x ein neues Objekt! Da ist es ja klar, dass __init__ erneut aufgerufen wird. Du arbeitest eben auf 2 unterschiedlichen Objekten.

So geht es:

Code: Alles auswählen

In [1]: class Test(object):
   ...:        def __init__(self):
   ...:
   ...:       self.new = 0
   ...:       self.old = 0
   ...:
   ...:    def function(self, value):
   ...:           self.new = value
   ...:       print self.new
   ...:       print self.old
   ...:       self.old = self.new
   ...:

In [2]: t = Test()

In [3]: t.function(1)
1
0

In [4]: t.function(2)
2
1

In [5]: t.function(42)
42
2
In Python 2.x sollten Klassen immer von object erben, zudem will PEP8 CamelCase bei Klassennamen.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Pretender2k
User
Beiträge: 27
Registriert: Freitag 23. Januar 2009, 18:23

Danke, das mit dem main() hab ich verballert!

Wollte nur eine instanz. Hab ich komplett uebersehen! Danke ...

P.S.: was ist CamelCase? <-- Falls jemand das auch wissen will: Antwort: http://en.wikipedia.org/wiki/CamelCase
Antworten