Sono nuovo in Python e ho lavorato con gli esempi in "A Byte of Python" di Swaroop CH. Sto vedendo alcuni comportamenti con il metodo __del__
che mi sta sconcertando.Il metodo __del__ viene chiamato in python quando non è previsto
In sostanza, se si esegue il seguente script (in Python 2.6.2)
class Person4:
'''Represents a person'''
population = 0
def __init__(self, name):
'''Initialize the person's data'''
self.name = name
print 'Initializing %s'% self.name
#When the person is created they increase the population
Person4.population += 1
def __del__(self):
'''I am dying'''
print '%s says bye' % self.name
Person4.population -= 1
if Person4.population == 0:
print 'I am the last one'
else:
print 'There are still %d left' % Person4.population
swaroop = Person4('Swaroop')
kaleem = Person4('Kalem')
utilizzando la console di Python (o la console interattiva Spyder) Vedo il seguente:
execfile (u'C: \ 1_eric \ Python \ test1.py ')
Inizializzazione Swaroop
inizializzazione Kalemexecfile (u'C: \ 1_eric \ Python \ test1.py ')
Inizializzazione Swaroop
Swaroop dice bye
Io sono l'ultimo
inizializzazione Kalem
Kalem dice bye
Io sono il ultimo
Perché il __del__
metodo viene chiamato immediatamente dopo esimo e __init__
alla seconda esecuzione?
Sto indovinando che dal momento che vengono utilizzati gli stessi nomi di istanza ("swaroop" e "kaleem") che sta rilasciando l'istanza originale e la raccolta dei dati inutili. Ma sembra che ciò stia sconvolgendo l'attuale numero di abitanti.
Cosa sta succedendo qui?
Qual è un buon modo per evitare questo tipo di confusione?
Evitare l'uso di __del__
? Verificare la presenza di nomi di istanza esistenti prima di riutilizzarli? ...
Grazie, Eric
Non si dovrebbe fare affidamento sul metodo '__del__' essere chiamato in un determinato momento in ogni caso. In futuro il garbage collector potrebbe cambiare in modo che '__del__' venga chiamato in momenti diversi. –
@Soviut (che lo ha ritradotto in modo errato): questo non ha nulla a che fare con "classmethods" in Python. Usa un attributo di classe, ma non è la stessa cosa. –
Benvenuti in Stack Overflow! Quando hai ricevuto una buona risposta alla tua domanda, per favore "accetta" la risposta più utile facendo clic sul riquadro della casella di controllo a sinistra della risposta. Questo indica che hai ricevuto una risposta che ha funzionato per te. Ciò consente di aumentare la tua reputazione sul sito. –