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