下面的代碼有問題:如何在Python中的RequestHandler處理程序實例內修改SocketServer服務器實例中的變量?
class Server(SocketServer.ForkingMixIn, SocketServer.TCPServer):
__slots__ = ("loaded")
class Handler(SocketServer.StreamRequestHandler):
def handle(self):
print self.server.loaded # Prints "False" at every call, why?
self.server.loaded = True
print self.server.loaded # Prints "True" at every call, obvious!
server = Server(('localhost', port), Handler)
server.loaded = False
while True:
server.handle_request()
每當一個新的請求時,輸出我得到的是False
其次True
。我想要的是False
之後是True
第一次,以及True
之後是True
此後。
爲什麼我對服務器實例中的變量所做的修改仍然存在於處理函數handle()
函數的範圍之外?
更新:
所以,我嘗試使用全局變量來實現我想要的東西:
loaded = False
class Server(SocketServer.ForkingMixIn, SocketServer.TCPServer):
pass
class Handler(SocketServer.StreamRequestHandler):
def handle(self):
global loaded
print loaded # Prints "False" at every call still, why?
loaded = True
print loaded # Prints "True" at every call, obvious!
def main():
server = Server(('localhost', 4444), Handler)
global loaded
loaded = False
while True:
server.handle_request()
if (__name__ == '__main__'):
main()
,它仍然無法正常工作,即像以前那樣產生相同的輸出。任何人都可以告訴我哪裏出錯了嗎?
從Python文檔:「如果一個名字被宣佈全球性的,那麼所有的引用和作業直接轉到包含模塊的全局名稱中間的範圍,否則,發現最裏面之外的所有變量範圍是只讀的(試圖寫入這樣一個變量只會在最內層的範圍內創建一個新的局部變量,而保持同名的外層變量不變)。所以,我認爲,我的問題歸結爲解決這個問題。 – 2010-10-05 22:15:54
我認爲這可能與ForkingMixIn類有關。嘗試刪除ForkingMixIn基類,看看是否改變了任何東西。 – flashk 2010-10-05 22:38:50
恩,試過了。沒有工作。我認爲問題是在兩次調用Handler實例之間共享相同的*可寫*範圍。 – 2010-10-05 23:10:27