When are python classes and class attributes collected?

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"

The above code is in Hidden.py and it works it python Hidden.pyproduces the following output:

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

I don’t see Member __del__ class memeither the file in the output class memunless I comment on one of the statements del. Why is this? When are python classes and class attributes loaded?

+4
source share
2 answers

This is reported as an error in http://bugs.python.org/issue1545463 fixed in 3.4, but not in the opposite (I ran 2.7). This was also explained at http://code.activestate.com/lists/python-list/504216/ . See below for output in 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
+2

classMem - WithMembers, , . Python. __del__ Member .

: Python 0 , __del__ ?

++, , . Python , . , __del__ , , , , , .

classMem.

- del WithMembers.classMem. 0 __del__ .

WithMembers ( object). :

...

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

:

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

, . http://www.electricmonk.nl/log/2008/07/07/python-destructor-and-garbage-collection-notes/

, .:)

0

All Articles