[Python-Dev] bug? classes whose metclass has del are not collectible (original) (raw)

Samuele Pedroni pedronis@bluewin.ch
Thu, 27 Feb 2003 13:48:43 +0100


new-style classes keep track of their subclasses through weak-refs so they remain in general collectible.

consider this code: (inspired by this post comp.lang.python post id: <b3khka$2g6$1@news.wplus.spb.ru> )

<test.py> import sys

class MyMetaclass(type):

def __init__(cls, name, bases, dict):
    super(MyMetaclass, cls).__init__(name, bases, dict)
    print 'initialized', cls.__name__

if 'meta__del__' in sys.argv:

print "meta__del__" def del(cls): print 'deleted', cls.name

class MyClass(object): if 'meta' in sys.argv: print "meta" metaclass = MyMetaclass pass

class Sub(MyClass): pass

del Sub

import gc

gc.collect() # force involved weak-refs to be cleared

print "MyClass subclasses",MyClass.subclasses() print "garbage",gc.garbage

</test.py>

Now:

C:\exp\py-subclasses-gc>\transit\Py23\python test.py MyClass subclasses [] garbage []

C:\exp\py-subclasses-gc>\transit\Py23\python test.py meta meta initialized MyClass initialized Sub MyClass subclasses [] garbage []

also Sub with both metaclass type or MyMetaclass without del is collectible and collected but:

C:\exp\py-subclasses-gc>\transit\Py23\python test.py meta meta__del__ meta__del__ meta initialized MyClass initialized Sub MyClass subclasses [<class '__main__.Sub'>] garbage [<class '__main__.Sub'>]

if MyMetaclass grows a del method Sub is no longer collectible ...