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
Problem mit Klasse und .append
Geht mir auch so mit deinem Posting ...c.holtermann hat geschrieben:Ich wäre für Verständnishilfe dankbar.

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.
Ich denke mal es wird folgender Fall vorliegen:
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:
testliste = []
>>> x = test()
>>> y = test()
>>> y.testliste.append(0)
>>> x.testliste
[0]
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
[]
- 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:
reicht, um `testliste` zu einem Instanz-Attribut zu machen.
Code: Alles auswählen
class test:
def __init__(self):
self.testliste = []
Zuletzt geändert von cofi am Donnerstag 21. Mai 2009, 15:28, insgesamt 1-mal geändert.
@cofi: Das reicht um eine Fehlermeldung zu bekommen, dass der Name `self` nicht definiert ist.
@cofi:
Naja, statt eine "ganzen" Klasse hätte man das auch weiterhin ohne `__init__()` schreiben können, indem man einfach das `self` weglässt:
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'
Wenn man von object erbt anscheinend schon.BlackJack hat geschrieben:@snafu: Lies doch bitte nochmal was das Problem war. Das geht so eben nicht.
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'
@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.
-
- 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
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 habeEyDu hat geschrieben:@Nocta: das ist nur der Fall, weil der Name durch einen neuen verdeckt wird.


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.
-
- 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
Herzlichen Dank. Mein Fehler war die Unkenntnis des
Unterschieds von Klassen- und Instanzvariablen, wie
Nocta es vermutet hatte.
Christoph Holtermann