在编写龙卷风Http Server时,我在主类中访问实例变量时遇到问题,该实例变量包含来自单独的RequestHandler对象的tornado应用程序对象以及start方法。考虑以下粗略的例子,
class MyServer(object):
def __init__(self):
self.ref_object = 0
self.application = #Add tornado.web.applicaiton here
def change_ref_object(self, ref_obj):
self.ref_object = ref_obj
def start(self):
#start the server
pass
class SomeHandler(tornado.web.RequestHandler):
def post(self):
#Yada, yada, yada
#Call method on Myserver's ref_object
pass
我需要在MyServer
的{{1}}方法中访问post()
的ref_object实例,我需要确保SomeHandler
中访问的ref_object是同一个对象如果它在SomeHandler
中发生了变化。
在创建python龙卷风Web服务器(应用程序)时,Somehandler仅作为类引用,并且不清楚如何在change_ref_object()
中更改其临时ref_object时更改其临时ref_object的实例{1}}。
这基本上归结于我不了解SomeHandler的实例在MyServer(或者特别是MyServer的应用程序对象)范围内的位置。
答案 0 :(得分:16)
创建Application
对象时,可以将ref_object
实例传递给SomeHandler
,方法是将其放在dict中,作为通常用于定义处理程序的元组的第三个参数。所以,在MyServer.__init__
:
self.application = tornado.web.Application([
(r"/test", SomeHandler, {"ref_object" : self.ref_object}),
])
然后将initialize
方法添加到SomeHandler
:
class SomeHandler(tornado.web.RequestHandler):
def initialize(self, ref_object):
self.ref_object = ref_object
def post(self):
self.ref_object.method()