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

Modifying Methods in Place

Credit: Ken Seehof

Problem

You need to globally change the behavior of existing classes in a third-party library—for example, by wrapping existing _ _init_ _ methods.

Solution

Avoid the antipattern of modifying library code, even though you have source for it, or you’ll be forever chasing upgrades to the library and reapplying your changes to each release. Python’s introspection lets you noninvasively obtain the same desired effect without changing the library’s source code:

# needs Python 2.1 or later
from _ _future_ _ import nested_scopes
import new

def enhance_ _init_ _(klass, f):
    try: ki = klass._ _init_ _
    except AttributeError:
        def ki(self, *args, **kwds): pass
    klass._ _init_ _ = new.instancemethod(
        lambda *args, **kwds: f(ki, *args, **kwds), None, klass)

def demo(  ):
    class X:
        def _ _init_ _(self, v):
            self.v = v

    def g(_ _init_ _, self, v):
        _ _init_ _(self, v)
        self.parrot='dead'

    enhance_ _init_ _(X, g)

    x = X(2)
    print x.parrot

demo(  )

Discussion

Once in a while it becomes necessary to globally change the behavior of classes in a third-party library, ideally without modifying the source code for that library. This recipe demonstrates the ability to modify the _ _init_ _ method of an arbitrary class in place at runtime by wrapping the method in any given metafunction. In my experience, this approach is also good for making functional programmers wince, which can be entertaining.

Of course, many other forms of currying besides the lambda used in this recipe ...

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