From: Terrel S. <tsh...@tr...> - 2001-03-29 17:35:06
|
Ian Bicking wrote: > I was thinking about Mixins, and I have a kind of theoretical question > that someone might be able to answer, or at least suggest upon. > > If I have a mixin that not only extends a class, but also overrides > methods, how do I deal with calling the original methods? > > Specifically, if I have something that can be mixed in with Page, and > I want to do something before Page._respond is called (but I still > want to call Page._respond), how would I do that? Kind of applies to > __init__, but people usually are aware of the issues there. > > I could do: > > def _respond(self, transaction): > # do my thing > Page._respond(self, transaction) > > But then if someone subclasses Page and changes _respond, this will > not only break their customization but will probably confuse the > dickens out of them when they see the bugs when one of the two methods > (the mixin or the Page-derivative) doesn't get run. > Someone who declares a class like this class SpecialPage(Mixedin,Page): ... should be aware of what Mixedin does. If SpecialPage also overrides _respond, then it should know to call Mixedin._respond, rather than Page._respond. If you are mixing in after the fact, then hmmm... Maybe a wrapper would be better: class Wrapper(Page): def __init__(self, wrapped): self._wrapped = wrapped def __getattr__( self, name ): return getattr(self.__dict__["_wrapped"],name) def _respond( self, transaction ): # do my stuff self._wrapped._respond( transaction ) # do post processing if needed The Java Servlet API uses this approach to change the behavior of Requests and Responses. Since you are specifically overriding _respond, I suspect that maybe a Filter (see Java Servlet API 2.3 http://www.ics.uci.edu/~tshumway/webware/current/pyserv/servlet/) is what you want. This is not currently implemented in Webware, but I think it should be. -- Terrel |