Genaue Beschreibung von __del__ ?

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.
tuxfreak
User
Beiträge: 9
Registriert: Donnerstag 28. August 2008, 21:48

Genaue Beschreibung von __del__ ?

Beitragvon tuxfreak » Montag 8. September 2008, 10:27

Hallo,
Ich bin bei diesem Programm auf das Problem gestoßen das wenn ich x den wert von p.info() zuweise p gelöscht wird. Ich hab auch mit Google nichts dazu gefunden. Deshalb wüsste ich gerne mehr über __del__ und die Garbage Collection. Konkret :
Wie kann ich verhindern das ein Objekt von der Garbage Collection gelöscht wird und es trotzdem löschen ? Warum verschwindet die Referenz (ohne die ja gelöscht wird) ?

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: utf_8 -*-
# Erstellt eine Einkaufsliste
# 11.8.08 Daniel

# Modulimport
import test
import list2txt


artnr = 0
x = 1
list = []
class Product:
    '''Ein Produkt mit Artikelnummer, Name, Preis und Anzahl'''
   
    def __init__(self, artnr, name, price, quantity):
        self.artnr = artnr
        self.name = name
        self.price = price
        self.quantity = quantity
        print "%d %s um insgesamt %.2f € hinzugefügt" % (self.quantity, self.name, (self.price * self.quantity))
       
    def __del__(self):
        '''Löscht ein Produkt'''
        print "%s gelöscht" % self.name
       
    def info(self):
        print "%06d\t%06d\t%8s\t%5.2f" % (self.artnr, self.quantity, self.name, self.price)
        return self.artnr, self.quantity, self.name, self.price

       
while x == 1: # Menu
    wahl = raw_input(">>>")
   
    if wahl == "1":  # Hinzufügen
        print "Was wollen sie hinzufügen ?"
        new_item = raw_input("Name: ")
        price = input("Preis:")
        quantity = input("Anzahl:")
        artnr += 1
        p = Product(artnr, new_item, price, quantity)
        list.append(p)
        print p
        x = p.info()
       
[code=]Einkaufsliste v0.1

Was wollen sie tun ?
1 Etwas zur Liste hinzufügen
>>>1
Was wollen sie hinzufügen ?
Name: Birnen
Preis:1.2
Anzahl:3
3 Birnen um insgesamt 3.60 € hinzugefügt
<__main__.Product instance at 0xb7db616c>
000001 000003 Birnen 1.20
Birnen gelöscht
[/code]

Edit (Leonidas): Code-Tags korrigiert.
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Re: Genaue Beschreibung von __del__ ?

Beitragvon Leonidas » Montag 8. September 2008, 10:40

tuxfreak hat geschrieben:Ich bin bei diesem Programm auf das Problem gestoßen das wenn ich x den wert von p.info() zuweise p gelöscht wird.

Quatsch. Mach danach ein ``print x`` und ein ``print p`` dann stellst du fest, dass die Ausgabe von ``__del__`` nicht bei der Zuweisung erfolgt, sondern danach und zwar wenn sich das Programm beendet.

Zu __del__ lies doch bitte die Dokumentation die zusammengefasst bedeutet: "__del__. Don't use it.".
My god, it's full of CARs! | Leonidasvoice vs Modvoice

Wer ist online?

Mitglieder in diesem Forum: hansjürgen, jan.b