Overriding methods in classes you don't control

Jp Calderone exarkun at divmod.com
Mon Mar 28 06:57:52 CEST 2005


On Mon, 28 Mar 2005 03:57:16 GMT, Alex VanderWoude <nospam at biteme.com> wrote:
>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.

    from thirdparty.project import Something

    orig = Something.meth
    def new(x, y, z):
        foo()
        orig(x, y, z)
        bar()
    Something.meth = new

  HTH,

  Jp



More information about the Python-list mailing list