加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

新旧样式类中的Python析构函数

发布时间:2020-12-16 21:56:06 所属栏目:Python 来源:网络整理
导读:参见英文答案 Why do new style class and old style class have different behavior in this case?????????????????????????????????????1个 我试图理解为什么对象破坏在新风格类中与旧风格类相比有不同的作用. class Wrapper(): class Inner(object): def

参见英文答案 > Why do new style class and old style class have different behavior in this case?????????????????????????????????????1个
我试图理解为什么对象破坏在新风格类中与旧风格类相比有不同的作用.

class Wrapper():
    class Inner(object):
        def __del__(self):
            print 'Inner destructor'

    innerInstance = Inner()

    def __del__(self):
        print 'Wrapper destructor'

if __name__ == '__main__':
    x = Wrapper()

在退出时,这将输出:

Wrapper destructor
Inner destructor

但是,如果我使用Wrapper作为新的样式类,则只调用包装器析构函数,输出为:

Wrapper destructor

有人可以解释上面显示的行为吗?

最佳答案
python data model明确指出:

It is not guaranteed that __del__() methods are called for objects that still exist when the interpreter exits.

在这种情况下,解释器退出时仍然存在Wrapper(类和实例)对象,因此无法保证它将被最终确定.即使我们看到Wrapper实例已经完成,也没有保证Wrapper类将被最终确定(这就是持有你的Inner实例).

作为旁注,如果我使用Jython运行此代码,则不会为任一对象调用__del__(无论我们是使用旧式还是新式类).令人惊讶的是,如果我明确地删除了对象,它甚至不起作用(使用Jython)(但是这个代码适用于CPython,无论旧式/新式):

class Wrapper():
    class Inner(object):
        def __del__(self):
            print 'Inner destructor'

    innerInstance = Inner()

    def __del__(self):
        print 'Wrapper destructor'

if __name__ == '__main__':
    print "foo"
    x = Wrapper()
    print "bar"
    del x
    del Wrapper

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读