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

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: Alles auswählen

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
Edit (Leonidas): Code-Tags korrigiert.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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 (former) Modvoice
Antworten