Skip to Content
Python Cookbook
book

Python Cookbook

by Alex Martelli, David Ascher
July 2002
Intermediate to advanced
608 pages
15h 46m
English
O'Reilly Media, Inc.
Content preview from Python Cookbook

Keeping References to Bound Methods Without Inhibiting Garbage Collection

Credit: Joseph A. Knapka

Problem

You want to hold bound methods, while still allowing the associated object to be garbage-collected.

Solution

Weak references were an important addition to Python 2.1, but they’re not directly usable for bound methods, unless you take some precautions. To allow an object to be garbage-collected despite outstanding references to its bound methods, you need some wrappers. Put the following in the weakmethod.py file:

import weakref

class _weak_callable:
    def _ _init_ _(self, obj, func):
        self.im_self = obj
        self.im_func = func

    def _ _call_ _(self, *args, **kws):
        if self.im_self is None:
            return self.im_func(*args, **kws)
        else:
            return self.im_func(self.im_self, *args, **kws)

class WeakMethod:
    """ Wraps a function or, more importantly, a bound method in
    a way that allows a bound method's object to be GCed, while
    providing the same interface as a normal weak reference. """

    def _ _init_ _(self, fn):
        try:
            self._obj = weakref.ref(fn.im_self)
            self._meth = fn.im_func
        except AttributeError:
            # It's not a bound method
            self._obj = None
            self._meth = fn

    def _ _call_ _(self):
        if self._dead(  ): return None
        return _weak_callable(self._getobj(  ), self._meth)

    def _dead(self):
        return self._obj is not None and self._obj(  ) is None

    def _getobj(self):
        if self._obj is None: return None
        return self._obj(  )

Discussion

A normal bound method holds a strong reference to the bound method’s object. That means that the ...

Become an O’Reilly member and get unlimited access to this title plus top books and audiobooks from O’Reilly and nearly 200 top publishers, thousands of courses curated by job role, 150+ live events each month,
and much more.

Read now

Unlock full access

More than 5,000 organizations count on O’Reilly

AirBnbBlueOriginElectronic ArtsHomeDepotNasdaqRakutenTata Consultancy Services

QuotationMarkO’Reilly covers everything we've got, with content to help us build a world-class technology community, upgrade the capabilities and competencies of our teams, and improve overall team performance as well as their engagement.
Julian F.
Head of Cybersecurity
QuotationMarkI wanted to learn C and C++, but it didn't click for me until I picked up an O'Reilly book. When I went on the O’Reilly platform, I was astonished to find all the books there, plus live events and sandboxes so you could play around with the technology.
Addison B.
Field Engineer
QuotationMarkI’ve been on the O’Reilly platform for more than eight years. I use a couple of learning platforms, but I'm on O'Reilly more than anybody else. When you're there, you start learning. I'm never disappointed.
Amir M.
Data Platform Tech Lead
QuotationMarkI'm always learning. So when I got on to O'Reilly, I was like a kid in a candy store. There are playlists. There are answers. There's on-demand training. It's worth its weight in gold, in terms of what it allows me to do.
Mark W.
Embedded Software Engineer

You might also like

Python Workout

Python Workout

Reuven M. Lerner
Python Cookbook, 3rd Edition

Python Cookbook, 3rd Edition

David Beazley, Brian K. Jones

Publisher Resources

ISBN: 0596001673Catalog PageErrata