Problem mit Klasse und .append

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
c.holtermann
User
Beiträge: 2
Registriert: Donnerstag 21. Mai 2009, 13:42
Wohnort: Ulm

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
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

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.
Nocta
User
Beiträge: 290
Registriert: Freitag 22. Juni 2007, 14:13

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
[]
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

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.
Zuletzt geändert von cofi am Donnerstag 21. Mai 2009, 15:28, insgesamt 1-mal geändert.
BlackJack

@cofi: Das reicht um eine Fehlermeldung zu bekommen, dass der Name `self` nicht definiert ist.
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Stimmt .. man sollte auch die ganze Klasse hinschreiben.
Nocta
User
Beiträge: 290
Registriert: Freitag 22. Juni 2007, 14:13

Hab ich zwar schon in meinem Edit drin, aber doppelt hält ja bekanntlich besser :)
Benutzeravatar
snafu
User
Beiträge: 6738
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

@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'
BlackJack

@snafu: Lies doch bitte nochmal was das Problem war. Das geht so eben nicht.
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

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 ;)
Nocta
User
Beiträge: 290
Registriert: Freitag 22. Juni 2007, 14:13

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'
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

@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]
>>>
Das Leben ist wie ein Tennisball.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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 :?
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Nocta
User
Beiträge: 290
Registriert: Freitag 22. Juni 2007, 14:13

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.
Benutzeravatar
snafu
User
Beiträge: 6738
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Ich bin schon gemein, was? ;P Nee, wusste das wirklich nicht.
c.holtermann
User
Beiträge: 2
Registriert: Donnerstag 21. Mai 2009, 13:42
Wohnort: Ulm

Hallo !

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

Christoph Holtermann
Antworten