何时收集python类和类属性垃圾?

可能
class Member(object):
    def __init__(self, identifier):
        self.identifier = identifier
        print "Member __init__", self.identifier

    def __del__(self):
        print "Member __del__", self.identifier
        with open("/home/might/" + self.identifier, "w") as outF:
            outF.write(self.identifier)

class WithMembers(object):
    def __init__(self):
        print "WithMembers __init__"
        print WithMembers.classMem
        self.instanceMem = Member("instance mem")

    def __del__(self):
        print "WithMembers __del__"

    classMem = Member("class mem")

if __name__ == "__main__":
    print "main"
    WithMembers()
    #del WithMembers.classMem       # "Member __del__ class mem" before "end"
    #del WithMembers                # "Member __del__ class mem" after "end"
    print "end"

上面的代码位于Hidden.py中,运行python Hidden.py产生以下输出:

Member __init__ class mem
main
WithMembers __init__
<__main__.Member object at 0x935aeec>
Member __init__ instance mem
WithMembers __del__
Member __del__ instance mem
end

除非取消注释其中之一,否则我不会Member __del__ class mem在输出或class mem文件中看到del为什么是这样?何时收集python类和类属性垃圾?

可能

这是在3.4中修复的http://bugs.python.org/issue1545463中报告的一个错误,但没有反向移植(我正在运行2.7)。http://code.activestate.com/lists/python-list/504216/中也对此进行了说明请参阅下面的python 3.5中的输出。

基于以上内容,我的理解是,在2.7中,WithMembers解释器退出时,新样式类仍然存在(未被GC清理)。结果,classMem不会进行垃圾回收,因为WithMembers仍在引用它。

请注意,新样式类具有对它们的循环引用__mro__以及一些内置的描述符(http://bugs.python.org/issue17950)。即使模块级别的新类在模块清除后被GC认为已死,但在模块清除被禁用后,GC调用以清除它们,因为它引起了太多其他问题。

这不会导致内存泄漏,因为操作系统会在解释器退出后清理资源。

class Member(object):
    def __init__(self, identifier):
        self.identifier = identifier
        print("Member __init__ " + self.identifier)

    def __del__(self):
        print("Member __del__ " + self.identifier)
        with open("/home/might/" + self.identifier, "w") as outF:
            outF.write(self.identifier)

class WithMembers(object):
    def __init__(self):
        print("WithMembers __init__")
        print(WithMembers.classMem)
        self.instanceMem = Member("instance mem")

    def __del__(self):
        print("WithMembers __del__")

    classMem = Member("class mem")

if __name__ == "__main__":
    print("main")
    WithMembers()
    print("end")

使用以下命令运行时输出以下内容python3 Hidden.py

Member __init__ class mem
main
WithMembers __init__
<__main__.Member object at 0xb6fc8e2c>
Member __init__ instance mem
WithMembers __del__
Member __del__ instance mem
end
Member __del__ class mem
Exception ignored in: <bound method Member.__del__ of <__main__.Member object at 0xb6fc8e2c>>
Traceback (most recent call last):
  File "class_member_gc.py", line 8, in __del__
NameError: name 'open' is not defined

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Python的“类属性”和“类函数”

来自分类Dev

何时创建python类属性

来自分类Dev

何时创建python类属性

来自分类Dev

Python垃圾收集器和类变量

来自分类Dev

Python垃圾收集器和类变量

来自分类Dev

限制类和类属性

来自分类Dev

Python:类方法参数和类属性的名称相同

来自分类Dev

函数和类属性(python)

来自分类Dev

类和类属性VB.NET

来自分类Dev

CompletableFuture和垃圾收集

来自分类Dev

难以理解类中的私有属性和Python 3中的类属性方法

来自分类Dev

Python 2.7类属性奇怪的行为

来自分类Dev

Python类中的类属性阴影

来自分类Dev

Python 2.7类属性的异常行为

来自分类Dev

Python类中的类属性阴影

来自分类Dev

Python:类本身的静态类属性

来自分类Dev

JavaScript Blob对象何时被垃圾收集?

来自分类Dev

何时在Ruby中收集常量垃圾?

来自分类Dev

Linux何时进行SSD垃圾收集?

来自分类Dev

Android NullPointerException - 字段何时被垃圾收集?

来自分类Dev

Java垃圾收集参考类

来自分类Dev

Python类属性和子类化

来自分类Dev

Python类属性和子类化

来自分类Dev

垃圾收集和毕加索的问题

来自分类Dev

python:什么阻止垃圾收集

来自分类Dev

Python:在基类中使用派生类属性

来自分类Dev

在Python中的多个类之间共享类属性

来自分类Dev

如何从 Python 中的类中访问类属性

来自分类Dev

python (2.7):使用类装饰器访问类属性