Python 无法理解HTTP请求处理程序函数如何能够访问Tornado中的应用程序对象

Python 无法理解HTTP请求处理程序函数如何能够访问Tornado中的应用程序对象,python,tornado,Python,Tornado,我正在阅读《龙卷风导论》一书,下面是作者解释如何阅读mongodb数据库的示例 import tornado.httpserver import tornado.ioloop import tornado.options import tornado.web import pymongo from tornado.options import define, options define("port", default=8000, help="run on the given port",

我正在阅读《龙卷风导论》一书,下面是作者解释如何阅读mongodb数据库的示例

import tornado.httpserver
import tornado.ioloop
import tornado.options
import tornado.web

import pymongo

from tornado.options import define, options
define("port", default=8000, help="run on the given port", type=int)

class Application(tornado.web.Application):
    def __init__(self):
        handlers = [(r"/(\w+)", WordHandler)]
        conn = pymongo.Connection("localhost", 27017)
        self.db = conn["example"]
        tornado.web.Application.__init__(self, handlers, debug=True)

class WordHandler(tornado.web.RequestHandler):
    def get(self, word):
        coll = self.application.db.words
        word_doc = coll.find_one({"word": word})
        if word_doc:
            del word_doc["_id"]
            self.write(word_doc)
        else:
            self.set_status(404)
            self.write({"error": "word not found"})

def main():
    tornado.options.parse_command_line()
    http_server = tornado.httpserver.HTTPServer(Application())
    http_server.listen(options.port)
    tornado.ioloop.IOLoop.instance().start()

if __name__ == "__main__":
    main()
我理解代码和它是如何工作的,但我不能理解一件事。WordHandler类的实例能够访问应用程序类实例。这是我无法理解的。以下是WordHandler函数中的行:

coll = self.application.db.words

对象不会传递给它,除了这一行之外,代码上没有“应用程序”出现。那么它是如何访问它的呢?tornado.httpserver.httpserver、WordHandler和应用程序是如何链接在一起的?

我对tornado一无所知,但我认为框架负责实例化处理程序,并在实例化时将应用程序传递给它们

事实上,您可以在代码中看到这一点:
应用程序。\uuu call\uu()
查找与URL匹配的处理程序,并实例化它:

因此,应用程序(即
self
)作为参数传递给RequestHandler实例化,因为我们处于应用程序的方法中。在处理程序
\uuuu init\uuuu
中,我们看到:

handler = spec.handler_class(self, request, **spec.kwargs) 
def __init__(self, application, request, **kwargs):
    super(RequestHandler, self).__init__()

    self.application = application