【问题标题】:Python: can't invoke parent class destructor with super()Python:无法使用 super() 调用父类析构函数
【发布时间】:2014-05-23 06:08:00
【问题描述】:

我不能从子类的析构函数中调用父类的析构函数。 请检查以下代码:

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

当我在DerivativeClass.__del__() 中使用super(DerivativeClass, self).__del__() 时,出现以下错误:

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

问题:

为什么我不能在子类的析构函数中使用super,而在子类的构造函数中却完全没问题?

【问题讨论】:

  • 我不确定确切的原因,但请注意super(DerivativeClass, self) 返回一个super 类型的对象,而不是BaseClass 的一个实例。 __del__ 可能对它的第一个参数做了一些假设,这对 super 对象无效。
  • super...前面放一个print(DerivativeClass),你就会看到发生了什么。
  • 或者在代码的最后一行添加del instance,以确保在类越过约旦之前丢弃实例。
  • 您可能根本不需要使用__del__。最好避免它,除非你知道你真的需要它。有关详细信息,请参阅this question 的好答案。

标签: python destructor super


【解决方案1】:

这似乎只在运行时退出时发生(因为DerivativeClassNone)。

这很好用:

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

这也很好用:

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

还有这个:

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

在 sn-ps 1 和 3 中,我确保实例在上课之前死亡。在 sn-p 2 中,我以一种非常丑陋的方式绕过了整个问题。

【讨论】:

  • 这是有道理的,因为程序退出时的行为是非常不可预测的
  • +1 所有三个示例的共同点是它们避免使用在解释器退出时(可能)不再在范围内的全局名称。
猜你喜欢
  • 1970-01-01
  • 2019-04-07
  • 2018-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多