I'm interested in adding some hooks to my code when a class (as opposed to an instance) is garbage collected or otherwise falls out of memory. Here is some example code:
def make_objects():
    class A(type):
        def __del__(cls):
            print 'class deleted'
    class B(object):
        __metaclass__ = A
        def __del__(self):
            print 'instance deleted'
    b = B()
print 'making objects'
make_objects()
print 'finished'
I was hoping to see:
- making objects
 - instance deleted
 - class deleted
 - finished
 
But instead all I saw was:
- making objects
 - instance deleted
 - finished
 
If I modify the code to explicitly call del B, it makes no difference:
def make_objects():
    class A(type):
        def __del__(cls):
            print 'class deleted'
    class B(object):
        __metaclass__ = A
        def __del__(self):
            print 'instance deleted'
    del B
Output:
- making objects
 - finished
 
My question is: is it possible to hook into an object being deleted? Is there something preventing the class B from being deleted that I may not be aware of?