Liste aus Objekten, welche aus Listen aus Objekten besteht

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
Michael999
User
Beiträge: 5
Registriert: Donnerstag 7. Februar 2008, 14:43

Hallo zusammen,
Ich bin neu hier, darum hallo zusammen!
Ich habe eine Frage zu Listen in Python: Ich wollte das folgende programmieren: Die Geom Klasse besteht aus einer Liste von 9 SuperModulen, welche aus 4 SUPERPIXELN bestehen, welche wiederum aus je 9 PIXELN besteht:

Code: Alles auswählen

NumberOfSuperModules=9
NumberOfSuperPixels=4
NumberOfPixels=9


class SuperModul:
	SuperPixels=[]
	CenterX=0
	CenterY=0
	def __init__(self):
		#nothing yet
		
		for SP in range(NumberOfSuperPixels):
			self.SuperPixels.append(SuperPixel())
		

class SuperPixel:
	Pixels=[]
	CenterX=0
	CenterY=0
	def __init__(self):
		#nothing yet
		
		for P in range(NumberOfPixels):
			self.Pixels.append(Pixel())
class Pixel:
	gAPDs=[]
	CenterX=0
	CenterY=0
	def __init__(self):
		#nothing yet
		a=1
		
	
class Geom:
	SuperModules=[]
	CenterX=0
	CenterY=0
        def __init__(self):
	
		for SM in range(NumberOfSuperModules):
			self.SuperModules.append(SuperModul())

		
		
		print len(self.SuperModules[0])
Das seltsame ist, dass wenn ich die Laenge von Geom.SuperModules[0] ausdrucke, dass ich 36 (d.h. 4*9) anstelle von nur 4 kriege... Habe ich da was falsch verstanden?
Herzlichen Dank fuer jegliche Hilfe!
Gruss,
Michael
Zuletzt geändert von Michael999 am Donnerstag 7. Februar 2008, 15:03, insgesamt 1-mal geändert.
Jan-Peer
User
Beiträge: 166
Registriert: Dienstag 2. Oktober 2007, 10:55

Könntest du den Code bitte so bearbeiten, daß die Einrückungen erhalten bleiben?
Michael999
User
Beiträge: 5
Registriert: Donnerstag 7. Februar 2008, 14:43

Jan-Peer hat geschrieben:Könntest du den Code bitte so bearbeiten, daß die Einrückungen erhalten bleiben?
Ja, sehr gerne, aber wie? (ich benutze emacs...)

Edit: Geschafft :)
Jan-Peer
User
Beiträge: 166
Registriert: Dienstag 2. Oktober 2007, 10:55

SuperModules[0] ist ein Objekt vom Teil SuperModule, das per se eigentlich gar keine Länge haben dürfte, es sei denn du überschreibst einige magische Methoden. Insofern wundere ich mich ein wenig, daß du da überhaupt was rausbekommst.

Zwei Sachen, die mir noch aufgefallen sind:
1.) Es ist in der Regel äußerst ungünstig, innerhalb von Klassen auf Modul-Konstanten zuzugreifen. Besser wäre es, wenn du die Werte den Klassen bei der Initialisierung übergibst.

2.) Du machst sehr fleißigen Gebrauch von Klassenvariablen, nutzst diese aber gar nicht (z.B. SuperModul.SuperPixels). Ich glaube, du wolltest hier eher Instanzvariablen haben - schau am besten noch mal in deine Lernunterlagen und versuch, dir den Unterschied klar zu machen. Tipp: Versuch mal, auf das Attribut CenterX deiner Geom-Instanz zuzugreifen.

Kann es sein, daß du gerade von einer anderen Sprache umsteigst?
Michael999
User
Beiträge: 5
Registriert: Donnerstag 7. Februar 2008, 14:43

Jan-Peer hat geschrieben:SuperModules[0] ist ein Objekt vom Teil SuperModule, das per se eigentlich gar keine Länge haben dürfte, es sei denn du überschreibst einige magische Methoden. Insofern wundere ich mich ein wenig, daß du da überhaupt was rausbekommst.

Zwei Sachen, die mir noch aufgefallen sind:
1.) Es ist in der Regel äußerst ungünstig, innerhalb von Klassen auf Modul-Konstanten zuzugreifen. Besser wäre es, wenn du die Werte den Klassen bei der Initialisierung übergibst.

2.) Du machst sehr fleißigen Gebrauch von Klassenvariablen, nutzst diese aber gar nicht (z.B. SuperModul.SuperPixels). Ich glaube, du wolltest hier eher Instanzvariablen haben - schau am besten noch mal in deine Lernunterlagen und versuch, dir den Unterschied klar zu machen. Tipp: Versuch mal, auf das Attribut CenterX deiner Geom-Instanz zuzugreifen.

Kann es sein, daß du gerade von einer anderen Sprache umsteigst?
Ja ich steige um von C++...
zu 2.) Wenn ich's richtig verstanden habe, sind Klassenvariablen in C "static". In Geom moechte ich einen Array aus 9 SuperModulen. Jedes Element aus diesem Array ist eine Instanzvariable vom Typ SuperModul, welches wiederum aus je 4 SuperPixeln besteht.
Mein Problem ist jetzt, dass am Ende jedes Element aus SuperModules aus 36 Superpixeln besteht...
1.) Wo mache ich dies genau?

Danke fuer die Hilfe!
Michael
Michael999
User
Beiträge: 5
Registriert: Donnerstag 7. Februar 2008, 14:43

Problem geloest, danke fuer die Hilfe!
Ich erzeuge jetzt die jeweiligen Listen in __init__ mit z.B. self.SuperPixel=[] etc etc.
Gruss,
Michael
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

Michael999 hat geschrieben: zu 2.) Wenn ich's richtig verstanden habe, sind Klassenvariablen in C "static". In Geom moechte ich einen Array aus 9 SuperModulen. Jedes Element aus diesem Array ist eine Instanzvariable vom Typ SuperModul, welches wiederum aus je 4 SuperPixeln besteht.
Das Attribut SuperPixels ist eine Klassenvariable (entspricht einer statischen Variable in C++). Du haengst an dieses Attribut bei jeder Instanzierung 4 Elemente dran (du hast ja hier nur ein Attribut pro Klasse, nicht eines pro Instanz) -- ergibt 36. Wahrscheinlich moechtest du das hier:

Code: Alles auswählen

class SuperModul:
    CenterX=0
    CenterY=0
    def __init__(self):
        self.SuperPixels = []
        for SP in range(NumberOfSuperPixels):
            self.SuperPixels.append(SuperPixel())
Offizielles Python-Tutorial (Deutsche Version)

Urheberrecht, Datenschutz, Informationsfreiheit: Piratenpartei
Michael999
User
Beiträge: 5
Registriert: Donnerstag 7. Februar 2008, 14:43

Rebecca hat geschrieben:
Michael999 hat geschrieben: zu 2.) Wenn ich's richtig verstanden habe, sind Klassenvariablen in C "static". In Geom moechte ich einen Array aus 9 SuperModulen. Jedes Element aus diesem Array ist eine Instanzvariable vom Typ SuperModul, welches wiederum aus je 4 SuperPixeln besteht.
Das Attribut SuperPixels ist eine Klassenvariable (entspricht einer statischen Variable in C++). Du haengst an dieses Attribut bei jeder Instanzierung 4 Elemente dran (du hast ja hier nur ein Attribut pro Klasse, nicht eines pro Instanz) -- ergibt 36. Wahrscheinlich moechtest du das hier:

Code: Alles auswählen

class SuperModul:
    CenterX=0
    CenterY=0
    def __init__(self):
        self.SuperPixels = []
        for SP in range(NumberOfSuperPixels):
            self.SuperPixels.append(SuperPixel())

Genau das war's!
Antworten