2014-04-09 23 views
6

Non riesco a richiamare il distruttore della classe Parent dal distruttore della classe Child. Vi preghiamo di controllare il codice qui sotto:Python: impossibile richiamare il distruttore della classe parent con super()

class BaseClass(object): 
    def __del__(self): 
     print 'BaseClass->Destructor' 

class DerivativeClass(BaseClass): 
    def __del__(self): 
     print 'DerivativeClass->Destructor' 
     #Invoke destructor of the base class, it works 
     BaseClass.__del__(self)   
     #Doesn't work 
     #super(DerivativeClass, self).__del__() 

instance = DerivativeClass() 

Quando uso super(DerivativeClass, self).__del__() in DerivativeClass.__del__() ho ottenuto il seguente errore:

Exception TypeError: 'must be type, not None' in <bound method 
DerivativeClass.__del__ of <__main__.DerivativeClass object at 0xb73a682c>> ignored 

DOMANDA:

Perché non posso usare super in il distruttore della classe figlio mentre è perfettamente a posto nel costruttore della classe bambino?

+1

Non sono sicuro della ragione esatta, ma si noti che 'super (DerivativeClass, self)' restituisce un oggetto di tipo 'super', non un'istanza di' BaseClass'. '__del__' probabilmente fa qualche ipotesi sul suo primo argomento che non è valido per gli oggetti' super'. – chepner

+1

Metti un 'print (DerivativeClass)' davanti a 'super ...' e vedrai cosa sta succedendo. – Hyperboreus

+1

Oppure aggiungi un 'del instance' come ultima riga al tuo codice per assicurarti che l'istanza venga gettata via prima che la classe passi sopra il Giordano. – Hyperboreus

risposta

5

Sembra che ciò si verifichi solo all'uscita di runtime (poiché DerivativeClass è None).

Questo funziona bene:

class BaseClass(object): 
    def __del__(self): 
     print 'BaseClass->Destructor' 

class DerivativeClass(BaseClass): 
    def __del__(self): 
     print 'DerivativeClass->Destructor' 
     super(DerivativeClass, self).__del__() 

instance = DerivativeClass() 
del instance 

E questo funziona bene anche:

class BaseClass(object): 
    def __del__(self): 
     print 'BaseClass->Destructor' 

class DerivativeClass(BaseClass): 
    def __del__(self): 
     print 'DerivativeClass->Destructor' 
     super(type(self), self).__del__() 

instance = DerivativeClass() 

anche questo:

class BaseClass(object): 
    def __del__(self): 
     print 'BaseClass->Destructor' 

class DerivativeClass(BaseClass): 
    def __del__(self): 
     print 'DerivativeClass->Destructor' 
     super(DerivativeClass, self).__del__() 

def someScope(): 
    instance = DerivativeClass() 

someScope() 

In frammenti 1 e 3, mi assicuro che l'istanza muore prima della lezione. In snippet 2 circumnavigare l'intera questione in modo abbastanza brutto.

+1

Ha senso, poiché il comportamento all'uscita del programma è del tutto imprevedibile – Konstantin

+2

+1 Il thread comune in tutti e tre gli esempi è che evitano di usare un nome globale che è (presumibilmente) non più in ambito quando l'interprete sta uscendo. – chepner

Problemi correlati