Seite 1 von 1

Liste aus Objekten, welche aus Listen aus Objekten besteht

Verfasst: Donnerstag 7. Februar 2008, 14:50
von Michael999
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

Verfasst: Donnerstag 7. Februar 2008, 14:54
von Jan-Peer
Könntest du den Code bitte so bearbeiten, daß die Einrückungen erhalten bleiben?

Verfasst: Donnerstag 7. Februar 2008, 15:02
von Michael999
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 :)

Verfasst: Donnerstag 7. Februar 2008, 15:23
von Jan-Peer
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?

Verfasst: Donnerstag 7. Februar 2008, 15:43
von Michael999
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

Verfasst: Donnerstag 7. Februar 2008, 15:54
von Michael999
Problem geloest, danke fuer die Hilfe!
Ich erzeuge jetzt die jeweiligen Listen in __init__ mit z.B. self.SuperPixel=[] etc etc.
Gruss,
Michael

Verfasst: Donnerstag 7. Februar 2008, 16:01
von Rebecca
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())

Verfasst: Donnerstag 7. Februar 2008, 16:13
von Michael999
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!