Overriding methods in classes you don't control

Alex VanderWoude nospam at biteme.com
Sun Mar 27 22:57:16 EST 2005


Is there a way to override a method on a class whose source you cannot
change in such a way that you can hook into that method's code?  After doing
some research, it appears that one way to do such a thing is to create a new
(non-class) method, and then assign the new method to the class in question,
thus replacing the existing class method.  However, I have read vague hints
in the documentation that this is not a good thing to do (?).  Furthermore,
you probably need access to the source code of the method you are replacing
so that you can duplicate and modify it in your method.  Now in this
particular case that is true, but what I really want to know is whether or
not there is an accepted Pythonic way to do this.

Here's the situation.  I'm using wxPython, and I want to make an enhancement
in the __init__ method of all the frame classes. The ideal place to do this
is in wxFrame.__init__, since any change there will automatically be
inherited by the other frame classes (for example, wxMDIParentFrame).
Obviously I can inherit from wxPython and make the changes in my subclass,
but then I would have to also subclass wxMDIParentFrame and duplicate my
enhancements there, and then use only my subclasses rather than the wx***
classes.

Basically I want to change wxFrame.__init__ so that it looks sort of like
this:

    def __init__(self, *args, **kwargs):
        # Some enhancements here.
        # The original code of this method, including the call to its
ancestor.
        # Some more enhancements here.

And then I can replace wxFrame's __init__ with my new version by assigning
it before any frames are instantiated.

Now I can do this since I have access to the wxPython source code.  However,
I would prefer to have some generalized way of grabbing the original code
and inserting it where that middle comment is.  That way, my enhancements
will continue to work even with other versions of wxPython (assuming of
course that my enhancements don't rely on anything in the original code,
which they don't).

Or am I barking up the wrong tree entirely?

- Alex






More information about the Python-list mailing list