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 ...
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4