Overriding methods in classes you don't control

John Roth newsgroups at jhrothjr.com
Mon Mar 28 00:36:56 EST 2005


Look up "Aspect Oriented Programming" and Python.
You should find several packages that can do this,
together with discussions of how to make cuts and all
that fun stuff. The feeling of power is very heady -  until
you have to maintain the resulting mess.

John Roth


"Alex VanderWoude" <nospam at biteme.com> wrote in message 
news:wgL1e.820524$6l.756354 at pd7tw2no...
> 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