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 -- http://mail.python.org/mailman/listinfo/python-list