Class extension confusion :(
Peter Otten
__peter__ at web.de
Wed Nov 10 04:52:40 EST 2010
r0g wrote:
> I have a subclass of BaseHHTPRequestHandler which uses a dictonary
> "paths" and a function "api_call" which are defined in the main
> namespace of the module. I'd rather I was able to pass these object to
> the constructor and store them as data attributes "self.paths" and
> "self.api_call" but I'm not sure how to do that properly. My
> understanding is that one may extend a constructor by defining it's
> __init__ method, calling the parents constructor and then adding ones
> own attributes to taste. What I don't understand is where or how I am
> supposed to get these extra constructor arguments into the class given
> that I don't instantiate it myself, it is seemingly instantiated by
> HTTPServer class that I pass it to e.g.
>
> httpd = HTTPServer(server_address, PlainAJAXRequestHandler)
>
> I wondered if I ought to instantiate an instance of
> PlainAJAXRequestHandler, set the attributes (either manually or by
> extending it's constructor) and pass that to HTTPServer but I figured it
> expects a class not an instance as it probably wants to spawn one
> instance for each request so that would be a non starter. Might I need
> to subclass HTTPServer, find the bit that instantiates the request
> handler and override that so it passes it's constructor more parameters?
> Right now I'm pretty confused, can somebody please tell me how I might
> accomplish this, what I'm failing to grasp or point me to the docs that
> explain it - I've spent the last hour or two plowing through docs to no
> avail, I guess it's a case of keyword ignorance on my part! Code
> follows...
Try passing a factory function instead of a class. Untested:
from functools import partial
class PlainAJAXRequestHandler(BaseHTTPRequestHandler):
def __init__(self, api_call, paths, *args, **kw):
BaseHTTPRequestHandler.__init__(self, *args, **kw)
self.api_call = api_call
self.paths = paths
paths = ...
api_call = ...
httpd = HTTPServer(
server_address,
partial(PlainAJAXRequestHandler, paths, api_call))
More information about the Python-list
mailing list