2014-04-09 17 views
6

Tôi không thể gọi destructor của lớp Parent từ destructor của lớp Child. Xin vui lòng, kiểm tra mã dưới đây:Python: không thể gọi destructor lớp cha với siêu()

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

Khi tôi sử dụng super(DerivativeClass, self).__del__() trong DerivativeClass.__del__() Tôi đã nhận lỗi sau:

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

HỎI:

Tại sao tôi không thể sử dụng super trong destructor của lớp con trong khi nó hoàn toàn tốt trong constructor của lớp con?

+1

Tôi không chắc chắn lý do chính xác, nhưng lưu ý rằng 'siêu (DerivativeClass, self)' trả về một đối tượng kiểu 'super', không phải là một thể hiện của' BaseClass'. '__del__' có thể làm cho một số giả định về đối số đầu tiên của nó không hợp lệ cho các đối tượng' super'. – chepner

+1

Đặt một 'in (DerivativeClass)' ở phía trước của 'siêu ...' và bạn sẽ thấy những gì đang xảy ra. – Hyperboreus

+1

Hoặc thêm một 'del instance' làm dòng cuối cùng vào mã của bạn để đảm bảo rằng thể hiện được bỏ đi trước khi lớp đó vượt qua Jordan. – Hyperboreus

Trả lời

5

Dường như điều này chỉ xảy ra khi thoát thời gian chạy (vì DerivativeClassNone).

này hoạt động tốt:

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 

Và điều này làm việc tốt quá:

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

Ngoài này:

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

Trong đoạn 1 và 3, tôi chắc chắn rằng cá thể chết trước lớp. Trong đoạn 2 tôi đi vòng quanh toàn bộ vấn đề theo một cách khá xấu xí.

+1

Điều đó có ý nghĩa, vì hành vi khi thoát khỏi chương trình là khá khó lường – Konstantin

+2

+1 Chuỗi chung trong cả ba ví dụ là chúng tránh sử dụng tên chung (có lẽ) không còn trong phạm vi khi trình thông dịch thoát. – chepner

Các vấn đề liên quan