Listeneinträge werden immer durch den neusten eintrag übersc

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.
dracana
User
Beiträge: 22
Registriert: Donnerstag 11. Oktober 2007, 10:49

Listeneinträge werden immer durch den neusten eintrag übersc

Beitragvon dracana » Mittwoch 6. Februar 2008, 17:01

Hallo,

Also ich hab 2 klassen für ein informatik-projekt geschrieben. Also zuerst werden Tuples angelegt, und die werden dann in einer liste aufgereiht. Mein problem: wenn ich ein neues tuple anlege wird dies auch angelegt aber alle anderen Tuples werden mit den gleichen werten überschrieben. :(

hier die definitionen zum Anlegen der Tuple:

Code: Alles auswählen

class produkt:

    def __init__(self):
        self.p_eintrag = ()

    def p_eintragen(self,name,preis):
        self.p_eintrag = (name,preis)


und hier die definitionen für die liste:

Code: Alles auswählen

class kategorie:

    def __init__(self):
        self.k_liste = []

    def k_eintragen(self,prd):
        self.k_liste.append(prd)


Codezwischenstück:

Code: Alles auswählen

kate = kategorie()
prd = produkt()


Und hier die Codezeile inder man die werte eingibt:

Code: Alles auswählen

       
name = raw_input('Name: ')
preis = raw_input('Preis: ')
prd.p_eintragen(name,preis)
kate.k_eintragen(prd)


Falls etwas ungenau ist einfach fragen, dann versuch ich es genauer bzw besser zu erklären. Ich danke Euch, für Eure Hilfe.

gruß
Thorsten

ps: falls der komplette quelltext weiterhilft, könnt ihr mich ruhig erreichen unter meiner email: thortewitty@hotmail.de
BlackJack

Beitragvon BlackJack » Mittwoch 6. Februar 2008, 17:24

Du erzeugst ja nur ein Produkt-Objekt, änderst dessen Daten ständig und fügst Referenzen auf dieses eine Objekt in die Kategorie ein.

Hinweis zur Namensgebung: Klassennahmen fangen konventionell mit einem Grossbuchstaben an. Dann braucht man sich für Instanzen der Klasse auch keine Abkürzungen ausdenken. und die einbuchstabigen Präfixe sind auch nicht so toll. Namen sollten in der Regel die Bedeutung deutlich machen und nicht den Typ. Also zum Beispiel nur `eintragen()` in beiden Klassen. Um welches `eintragen()` es sich handelt, ist ja schon durch den Typ klar, auf dem die Methode aufgerufen wird. Oder statt `self.k_liste` wäre `self.produkte` viel aussagekräftiger.
dracana
User
Beiträge: 22
Registriert: Donnerstag 11. Oktober 2007, 10:49

Beitragvon dracana » Mittwoch 6. Februar 2008, 17:49

oke dankeschön für deine tipps in der Namengebung. Ich werd sie berücksichtigen =) So ansonsten, ist der fehler behoben. Dankeschön :). Naja nun stellt sich mir aber eine neue frage: Und zwar wenn ich mir die Liste ausgebenlasse, steht da unter jedem eingetragenden tupel ein "None" ich würd gerne wissen wie ich das wegbekomme.

in der klasse Produkte:

Code: Alles auswählen

    def ausgeben(self):
        print 'Bezeichnung: ', self.p_eintrag[0]
        print 'Preis:       ', self.p_eintrag[1]


in der klasse Kategorien:

Code: Alles auswählen

    def produkte_ausgeben(self):
        for i in range(self.k_liste.__len__()):
            print self.k_liste[i].ausgeben()


bei:

Code: Alles auswählen

Kategorie.produkte_ausgeben()


sieht man folgendes Bild: Bild ich wäre sehr froh über ein Denkansatz, wie dies zustande kommt. Den ich weiß wirklich nicht wo das her kommt. Vielen dank

mfg
thorsten[/img]
Darii
User
Beiträge: 1177
Registriert: Donnerstag 29. November 2007, 17:02

Beitragvon Darii » Mittwoch 6. Februar 2008, 17:59

Das kommt daher:

Code: Alles auswählen

print self.k_liste[i].ausgeben()


ausgeben() hat aber keinen Rückgabewert also erzeugt print ausgeben() ein None. Mach einfach das print weg.
dracana
User
Beiträge: 22
Registriert: Donnerstag 11. Oktober 2007, 10:49

Beitragvon dracana » Mittwoch 6. Februar 2008, 18:30

hey, danke :) so jetzt funktioniert alles... vielen dank!
BlackJack

Beitragvon BlackJack » Mittwoch 6. Februar 2008, 19:16

@dracana: Name und Preis sollten Attribute sein und nicht in einem Tupel stecken. Das ist verständlicher als das man sich immer merken muss was denn der jeweilige Index bedeutet. Also z.B. ``self.preis`` statt ``self.p_eintrag[1]``.

"Magische" Methoden sollte man nicht direkt aufrufen wenn es einen einfacheren, idiomatischeren Weg gibt. Also ``len(self.produkte)`` statt ``self.produkte.__len__()``.

Allerdings ist das iterieren mit Index auch nicht nötig und in Python unüblich weil man direkt über die Elemente einer Liste iterieren kann:

Code: Alles auswählen

    def produkte_ausgeben(self):
        for produkt in self.produkte:
            produkt.ausgeben()

Wer ist online?

Mitglieder in diesem Forum: de_tom