2013-08-21 65 views
1

我要创建这样一个服务器:不Python的HttpServer的实例化一个新的请求处理程序为每个请求

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的消息仅打印一次违背这一点。

有人能告诉我这是怎么回事?

回答

2

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

什么时候self.x += 1叫发生,是的self.x从类级读取,但随后的分配上实例级别进行,因此新x创建特定于该实例。

你可以尝试从self.x改变它MyHandler.x看看会发生什么。

+0

其因0是不可变的对象。第一个'self.x + = 1'获取类级别的值,增加它,并为结果创建一个对象级别的变量。未来'self.x + = 1'表达式获取对象级变量。它与'self.x = MyHandler.x + 1'相同。 – tdelaney

+0

是的,将self.x更改为MyHandler.x确实修复了它,谢谢。但我恐怕我不明白为什么。我其实是Python的新手。在类定义中创建的变量是静态的,即在所有实例之间共享,就像你说的那样?将Java实例变量相当于像self.x – RTF

+0

@tdelaney好,谢谢__init__声明,我想我明白了 – RTF

相关问题