Seite 1 von 1

Problem mit Klasse und .append

Verfasst: Donnerstag 21. Mai 2009, 13:52
von c.holtermann
Hallo !

Bei meinen Versuchen, mich in Python einzuarbeiten bin Ich
auf ein Problem gestoßen :

class Planeten_klasse:
Laenge=[]
Breite=[]
Planet=[]
Planet.append(Planeten_klasse())
Planet.append(Planeten_klasse())
Planet[0].Laenge.append(0)

letzteres sollte so hatte Ich gehofft dazu führen, daß im Array
Laenge des Planet[0] ein neuer Wert angehängt wird. Dieser
wird aber, was Ich nicht will, auch bei Planet[1].Laenge angehängt
und weiteren Instanzen, wenn Ich das Array von Planet größer
mache.
Es scheint append an der Klasse tätig zu werden und nicht an
der Instanz, was Ich gar nicht verstehe.

Ich wäre für Verständnishilfe dankbar.

herzlichen Gruß,

Christoph Holtermann

Re: Problem mit Klasse und .append

Verfasst: Donnerstag 21. Mai 2009, 14:03
von numerix
c.holtermann hat geschrieben:Ich wäre für Verständnishilfe dankbar.
Geht mir auch so mit deinem Posting ... :)

Aber erstmal: Willkommen im Forum!

Das sieht irgendwie ziemlich verworren aus. Wenn du das ganze in Code-Tag setzt, hilft das schon mal ein wenig.

Vielleicht könntest du mal beschreiben, was du überhaupt erreichen willst (allgemeiner, über das hinaus, was du schon geschildert hast). Dann bekommst du vielleicht Hinweise, wie man es grundsätzlich angehen sollte, statt nur an Symptomen herumzudoktern.

Verfasst: Donnerstag 21. Mai 2009, 14:17
von Nocta
Ich denke mal es wird folgender Fall vorliegen:

Code: Alles auswählen

>>> class test:
	testliste = []

	
>>> x = test()
>>> y = test()
>>> y.testliste.append(0)
>>> x.testliste
[0]
testliste gilt hier eben für die ganze Klasse.
An ein Objekt gebundene Variablen kannst du mit self.variable zB in der __init__ Methode (oder auch in anderen Methoden) definieren. Vielleicht solltest du dir zu den OOP Grundlagen noch ein Tutorial oder so durchlesen.

Edit: Beispielsweise sowas:

Code: Alles auswählen

>>> class test:
	def __init__(self):
		self.testliste = []

		
>>> x = test()
>>> y = test()
>>> x.testliste.append(0)
>>> y.testliste
[]

Verfasst: Donnerstag 21. Mai 2009, 14:21
von cofi
Um das von Nocta aufgezeigte Problem zu lösen:

Code: Alles auswählen

class test:
    def __init__(self):
        self.testliste = []
reicht, um `testliste` zu einem Instanz-Attribut zu machen.

Verfasst: Donnerstag 21. Mai 2009, 14:57
von BlackJack
@cofi: Das reicht um eine Fehlermeldung zu bekommen, dass der Name `self` nicht definiert ist.

Verfasst: Donnerstag 21. Mai 2009, 15:27
von cofi
Stimmt .. man sollte auch die ganze Klasse hinschreiben.

Verfasst: Donnerstag 21. Mai 2009, 15:38
von Nocta
Hab ich zwar schon in meinem Edit drin, aber doppelt hält ja bekanntlich besser :)

Verfasst: Donnerstag 21. Mai 2009, 15:55
von snafu
@cofi:

Naja, statt eine "ganzen" Klasse hätte man das auch weiterhin ohne `__init__()` schreiben können, indem man einfach das `self` weglässt:

Code: Alles auswählen

In [1]: class Foo(object): bar = 'baz'
   ...: 

In [2]: foo = Foo()

In [3]: foo.bar
Out[3]: 'baz'

Verfasst: Donnerstag 21. Mai 2009, 16:16
von BlackJack
@snafu: Lies doch bitte nochmal was das Problem war. Das geht so eben nicht.

Verfasst: Donnerstag 21. Mai 2009, 16:37
von cofi
Nocta hat geschrieben:Hab ich zwar schon in meinem Edit drin, aber doppelt hält ja bekanntlich besser :)
Naja oder in dem Fall schlechter :) Zumindest bis BlackJack kam ;)

Verfasst: Donnerstag 21. Mai 2009, 17:02
von Nocta
BlackJack hat geschrieben:@snafu: Lies doch bitte nochmal was das Problem war. Das geht so eben nicht.
Wenn man von object erbt anscheinend schon.

Code: Alles auswählen

>>> class Foo(object): bar = 'baz'

>>> x = Foo()
>>> y = Foo()
>>> x.bar
'baz'
>>> x.bar = "test"
>>> x.bar
'test'
>>> y.bar
'baz'

Verfasst: Donnerstag 21. Mai 2009, 17:14
von EyDu
@Nocta: das ist nur der Fall, weil der Name durch einen neuen verdeckt wird.

Code: Alles auswählen

>>> class Foo(object): bar = []
...
>>> x = Foo()
>>> y = Foo()
>>> x.bar
[]
>>> y.bar
[]
>>> x.bar.append(1)
>>> x.bar
[1]
>>> y.bar
[1]
>>>

Verfasst: Donnerstag 21. Mai 2009, 17:26
von Leonidas
Das hat Diez Roggisch letztens in de.comp.lang.python in einer Diskussion mit Ole Streicher erklärt, aber ich muss zugeben, dass ich den Post nicht mehr wiederfinden kann :?

Verfasst: Donnerstag 21. Mai 2009, 17:59
von Nocta
EyDu hat geschrieben:@Nocta: das ist nur der Fall, weil der Name durch einen neuen verdeckt wird.
Ich hab mich schon gewundert ... Da hat mich snafu ganz schön reingelegt, indem er einen String und keine Liste genommen hat und ich folglich mit dem String experimentiert habe :shock: :D
Ich hätte das Verhalten auch ziemlich blöd gefunden, da es doch gerade der Sinn von Klassenvariablen ist, sich nicht wie Instanzvariablen zu verhalten.

Verfasst: Donnerstag 21. Mai 2009, 20:10
von snafu
Ich bin schon gemein, was? ;P Nee, wusste das wirklich nicht.

Danke !

Verfasst: Montag 25. Mai 2009, 13:14
von c.holtermann
Hallo !

Herzlichen Dank. Mein Fehler war die Unkenntnis des
Unterschieds von Klassen- und Instanzvariablen, wie
Nocta es vermutet hatte.

Christoph Holtermann