2014-04-09 29 views
6

ile ana sınıfı yıkıcıyı çağırma Üst sınıfın yok edicisini Çocuk sınıfının yıkıcısından çağırmıyorum. , aşağıdaki kodu kontrol edin: Ben DerivativeClass.__del__() içinde super(DerivativeClass, self).__del__() kullandığınızdaPython: 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() 

aşağıdaki hata var:

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

SORU:

Neden içinde super kullanamıyorum Çocuk sınıfının kurucusunda mükemmel derecede ince iken çocuk sınıfının yıkıcısı mı?

+1

Tam nedenlerden emin değilim, ancak 'super (DerivativeClass, self)' 'super' türünde bir nesne döndürdüğünü, 'BaseClass'ın bir örneğini döndürmediğini unutmayın. '__del__' muhtemelen' süper 'nesneler için geçerli olmayan ilk argümanı hakkında bazı varsayımlar yapar. – chepner

+1

'süper ... 'nin önüne bir' print (DerivativeClass) 'yazın ve neler olduğunu göreceksiniz. – Hyperboreus

+1

Veya sınıfın Ürdün'ü geçmeden önce atıldığından emin olmak için kodunuza son bir satır olarak bir 'del örneği' ekleyin. – Hyperboreus

cevap

5

Bu, yalnızca çalışma zamanı çıkışında gerçekleşir (çünkü DerivativeClass, None'dur).

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 

Ve bu ince çok işler:

Bu iyi çalışır Ayrıca

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() 

bu:

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() 
snippet'lar 1 ve 3'te

, emin olun Bu örnek sınıftan önce ölür. Snippet 2'de, tüm sorunu oldukça çirkin bir şekilde dolaşıyorum.

+1

Programın çıkışındaki davranışlar oldukça öngörülemeyeceğinden, mantıklıdır. – Konstantin

+2

+1 Üç örnekte de yaygın olan iş parçacığı, yorumlayıcıdan çıkarken artık kapsam dışında olan genel bir ad kullanmaktan kaçınmalarıdır. – chepner