2013-08-21 26 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

相關問題