我有一个在python中使用Tornado框架的基本websocket服务器。我想在服务器功能之间共享一个值:
class EchoWebSocket(websocket.WebSocketHandler):
def check_origin(self, origin):
return True
def open(self):
print ("connection opened")
def on_close(self):
tornado.ioloop.IOLoop.instance().stop()
print ("connection closed")
def on_message(self,message):
print (message)
def Main():
application = tornado.web.Application([(r"/", EchoWebSocket),])
application.listen(9000)
tornado.ioloop.IOLoop.instance().start()
if __name__ == "__main__":
Main()
我试图从这样的类创建一个全局对象:
class operate:
state = "mutual"
def __init__(self):
self.state = 'mutual'
def play(self):
self.state = 'play'
def pause(self):
self.state = 'pause'
def getStatus(self):
return self.state
并调用一个全局对象,猜测由于该对象是全局的,因此每个消息都不会创建一个新对象:
def open(self):
global objectTV
objectTV = operate()
objectTV.play()
.
.
.
.
def on_message(self,message):
global objectTV
objectTV = operate()
print(objectTV.getStatus())
但是它总是打印出来的?#?
。答案 0 :(得分:1)
在方法on_message()
中,每次收到新邮件时,您都会在objectTV
一次又一次地实例化objectTv = operate()
。 operate
类的新实例的初始状态设置为'mutual'
,这就是它打印'mutual'
的原因。
一个简单的解决方法是从objectTV = operate()
删除on_message()
行,它应该像你想要的那样工作。
但是在这个问题上阅读了一些答案:Why are global variables evil?。
因此,解决问题的更好方法是在处理程序实例上设置本地属性:
class EchoWebSocket(websocket.WebSocketHandler):
...
def open(self):
self.objectTV = operate()
self.objectTV.play()
def on_message(self, message):
print(self.objectTV.getStatus()) # -> 'play'