Создает ли 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 печатается только один раз, противоречит этому.

Может кто-нибудь сказать мне, что здесь происходит?

1 ответ

Решение

Это ничему не противоречит. Потому что ты звонишь SomeClass() в определении класса (а не __init__), он вызывается, когда класс определен, а не когда создается его экземпляр.

Что происходит, когда self.x += 1 называется то, что значение self.x читается с уровня класса, но затем выполняется назначение на уровне экземпляра, поэтому новый x создается, что является специфическим для экземпляра.

Вы можете попробовать изменить его с self.x в MyHandler.x и посмотрим, что получится.

Другие вопросы по тегам