Как вернуть html-страницу с контроллера restful при весенней загрузке?

У вас нет неявного доступа к атрибутам внутри методов в Python.

Голова имя типа currentid в строке:

del connections[currentid]

всегда ищет имя в области локальных функций, затем в каждой области охватывающей функции, перед тем, как попробовать глобальную область модуля (а затем посмотрите на встроенные вложения в качестве последнего средства). currentid - это атрибут класса, который не будет найден ни в одном из этих областей.

Чтобы найти атрибут в Python, вам всегда нужно указать объект для просмотра. Хотя протокол поиска означает, что объект необязательно должен иметь сам атрибут; поиск атрибута вернется к классу указанного вами объекта (и базовые классы, если наследование задействовано).

Итак, это сработает:

del connections[self.currentid]

Однако I не думайте, что остальная часть вашего кода делает то, что вы думаете. Эта строка в методе open:

currentid = global_counter

не устанавливает атрибут currentid вашего объекта SocketHandler. При назначении головому имени всегда присваивает локальную переменную, если вы явно не объявляете ее global (вы, похоже, знаете об этом, так как вы использовали ключевое слово global). Таким образом, в методе open currentid является локальной переменной функции; его значение теряется в конце метода open.

На самом деле, ваши SocketHandler объекты вообще не имеют атрибута currentid (если только нет кода, который вы нам не показали ). Помещение currentid = 0 в блок класса не дает всем экземплярам SocketHandler атрибуту currentid. Это дает SocketHandler класс самому атрибуту currentid; это так же, как блок def open(self): создает атрибут open (сохраняющий функцию) для объекта класса, а не для каждого отдельного экземпляра.

Чтение self.currentid в методе on_close не будет выполнено найти атрибут currentid в объекте self, поэтому Python будет смотреть на класс self, который является SocketHandler. Этот объект имеет значение currentid, поэтому результат чтения self.currentid будет 0, независимо от того, вы ранее выполняли open на этом SocketHandler.

Если вы хотели сохранить currentid в качестве переменной экземпляра в каждом SocketHandler, тогда строка в open должна быть:

self.currentid = global_counter

Это назначает currentid атрибута объекта, на который ссылается self. Вам также потребуется изменить все остальные ссылки на currentid в ваших методах на self.currentid.

13
задан kukkuz 16 October 2018 в 01:21
поделиться