Frage zu Klasseninstanzen

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
samy-delux
User
Beiträge: 44
Registriert: Donnerstag 26. April 2007, 19:23

Hey Leute,

Ich Programmiere fuer Informatik so eine Flugverbindungsuche... Da ich das ganze jetzt einfach mal rekursiv gestalten wollte um nicht nur direkte Verbindungen und Verbindungen mit einem mal umsteiegen zu finden.
Das ist aber auch eigentlich egal!
Ich habe mal ein Stueck Beispiel Code geschrieben, da sich hier bestimmt keiner mit meinem kompletten Programm rumschlagen will:

Code: Alles auswählen

#!/usr/bin/env python

class initiator:
    def __init__ (self):
        classes = range(5)
        
        for x in classes:
            x = object("test")
            print x.tree


class object:
    tree = []
    
    def __init__(self, treeinit):
        self.tree.append( treeinit )


initiator()
Ausgabe dazu:

Code: Alles auswählen

$ ./workspace/Flugmanager/classtest.py
['test']
['test', 'test']
['test', 'test', 'test']
['test', 'test', 'test', 'test']
['test', 'test', 'test', 'test', 'test']
Mein Problem: Warum wird die liste immer laenger?? Es sollten doch 5 Objekte der Klasse erzeugt werden, die jeweils nur ein "test" als Wert von 'tree' besitzen, oder? Da immer an die in der neuen Klasseninstanz noch leere Liste 'tree' einfach nur einmal "test" angehaengt wird...

Wo liegt mein Denkfehler??

so long,
Samy
rolgal_reloaded
User
Beiträge: 312
Registriert: Dienstag 24. Oktober 2006, 19:31

Also ich sehe das Problem darin:

classes = range(5)

range(5) erzeugt einfach nur eine Liste mit fünf Einträgen, also [0, 1, 2, 3, 4]

und dann iterierst du darüber.
Also hättest du genauso gut for x in range(5) schreiben können.
Weiters erzeugtst damit nicht fünf Objekte der Klasse object.

x wird immer neu überschrieben, wobei sich die Klassenvariable von object bei jedem mal verändert, also die Liste tree erweitert wird.
Bei der zweiten Instanzierung gibt es einen Eintrag, bei der dritten zwei usw.

Ich kenn das ganze Programm nicht, aber die Konstrukiton ansich wirkt etwas schräg.

object ist ausserdem kein guter Name - ist reserviert.

LG

rolgal_reloaded
samy-delux
User
Beiträge: 44
Registriert: Donnerstag 26. April 2007, 19:23

rolgal_reloaded hat geschrieben:Also hättest du genauso gut for x in range(5) schreiben können.
Weiters erzeugtst damit nicht fünf Objekte der Klasse object.
Das ist mir klar. Sorry, ich wollte eigentlich mit dem classes noch was machen. Es hat also keine bedeutung...
Es ist ja egal ob der Code jetzt so wie hier aussieht oder wie im ersten Post...

Code: Alles auswählen

#!/usr/bin/env python

class initiator:
    def __init__ (self):
        for x in range(5):
            x = object("test")
            print x.tree


class object:
    tree = []
    
    def __init__(self, treeinit):
        self.tree.append( treeinit )


initiator()
Das Problem bleibt ja bestehen...
rolgal_reloaded
User
Beiträge: 312
Registriert: Dienstag 24. Oktober 2006, 19:31

samy-delux hat geschrieben:
rolgal_reloaded hat geschrieben:Also hättest du genauso gut for x in range(5) schreiben können.
Weiters erzeugtst damit nicht fünf Objekte der Klasse object.
Das ist mir klar. Sorry, ich wollte eigentlich mit dem classes noch was machen. Es hat also keine bedeutung...
Es ist ja egal ob der Code jetzt so wie hier aussieht oder wie im ersten Post...

Code: Alles auswählen

#!/usr/bin/env python

class initiator:
    def __init__ (self):
        for x in range(5):
            x = object("test")
            print x.tree


class object:
    tree = []
    
    def __init__(self, treeinit):
        self.tree.append( treeinit )


initiator()
Das Problem bleibt ja bestehen...
Du hast das Wesentliche von meinem Post übersehen?!

x wird immer neu überschrieben, wobei sich die Klassenvariable von object bei jedem mal verändert, also die Liste tree erweitert wird.
Bei der zweiten Instanzierung gibt es einen Eintrag, bei der dritten zwei usw.
samy-delux
User
Beiträge: 44
Registriert: Donnerstag 26. April 2007, 19:23

Ja, aber sollte nicht jede Instanz von Object sozusagen seine eigene Variable 'tree' haben???
Benutzeravatar
mq
User
Beiträge: 124
Registriert: Samstag 1. Januar 2005, 19:14

samy-delux hat geschrieben:Ja, aber sollte nicht jede Instanz von Object sozusagen seine eigene Variable 'tree' haben???
Ja. Und eben deshalb solltest du die Variable nicht in der Klassendefinition setzen.
rolgal_reloaded
User
Beiträge: 312
Registriert: Dienstag 24. Oktober 2006, 19:31

lumax hat geschrieben:
samy-delux hat geschrieben:Ja, aber sollte nicht jede Instanz von Object sozusagen seine eigene Variable 'tree' haben???
Ja. Und eben deshalb solltest du die Variable nicht in der Klassendefinition setzen.
Ja, aber hat er deshalb fünf verschiedene Objekte??

LG

rolgal_reloaded
pyStyler
User
Beiträge: 311
Registriert: Montag 12. Juni 2006, 14:24

Hallo,
ich sage jetzt mal nichts dazu!

Code: Alles auswählen

class initiator: 
    def __init__ (self): 
        classes = range(5) 
        
        for x in classes: 
            x = object("test") 
        print x.tree 


class object: 
    tree = [] 
    
    def __init__(self, treeinit): 
        self.tree.append( treeinit ) 
initiator()
Gruss
pyStyler
rolgal_reloaded
User
Beiträge: 312
Registriert: Dienstag 24. Oktober 2006, 19:31

pyStyler hat geschrieben:Hallo,
ich sage jetzt mal nichts dazu!



Gruss
pyStyler
Aha, das klärt natürlich alles, ein Blick auf den Code sind mehr als tausend Worte oder wie?

Liebe Grüße

rolgal_reloaded
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

rolgal_reloaded hat geschrieben:Ja, aber hat er deshalb fünf verschiedene Objekte??
Ja! Statt tree = [] in Zeile 11 schreibe einmal self.tree = [] in __init__().
Übrigens ist die Klasse object eine Standardklasse. Du solltest besser einen anderen Namen verwenden.
MfG
HWK
rolgal_reloaded
User
Beiträge: 312
Registriert: Dienstag 24. Oktober 2006, 19:31

HWK hat geschrieben:
rolgal_reloaded hat geschrieben:Ja, aber hat er deshalb fünf verschiedene Objekte??
Ja! Statt tree = [] in Zeile 11 schreibe einmal self.tree = [] in __init__().
Übrigens ist die Klasse object eine Standardklasse. Du solltest besser einen anderen Namen verwenden.
MfG
HWK
Da hab ich wohl wieder was nicht gecheckt. Tatsächlich sind es fünf:

Code: Alles auswählen

class initiator:
    def __init__ (self):
        for x in range(5):
            x = object("test")
            print x.tree


class object:
    #tree = []

    count = 0 
   
    def __init__(self, treeinit):
        self.tree = []
        self.tree.append( treeinit )
        self.__class__.count += 1 


initiator()

Aber sie müssten anonym sein, oder?

LG

r_r
Antworten