Python HttpServer是否为每个请求实例化一个新的请求处理程序

时间:2013-08-21 18:14:58

标签: python http httpserver basehttprequesthandler

我正在创建一个这样的服务器:

server = HTTPServer(('', PORT_NUMBER), MyHandler)

...然后是处理程序:

class MyHandler(BaseHTTPRequestHandler):
    x = 0
    some_object = SomeClass()

    def do_GET(self):
        print self.x
        self.x += 1
        # etc. but x is not used further

class SomeClass:
    def __init__(self):
        print "Initialising SomeClass"

现在,每次我发出get请求时,为self.x打印的值总是为0.但是,当服务器第一次启动时,SomeClass构造函数只被调用一次(我假设是这种情况,因为构造函数中的打印消息只调用一次)。

self.x为每个请求保持重置的事实表明为每个请求重新创建了新的处理程序类,但SomeClass消息只打印一次的事实与此相矛盾。

有人能告诉我这里发生了什么吗?

1 个答案:

答案 0 :(得分:2)

它与任何事情都不矛盾。因为您在类定义中调用SomeClass()(而不是__init__),所以在类定义时调用它,而不是在实例化

调用self.x += 1时会发生什么,self.x的值是从类级别读取,但随后在实例上进行了分配级别,因此创建了一个特定于该实例的新x

您可以尝试将其从self.x更改为MyHandler.x,看看会发生什么。