Почему мой код python для дерева двоичного поиска показывает эту странную ошибку? [Дубликат]

Ответ Дэвида дает смысл каждого модификатора доступа. Что касается использования каждого из них, я бы предложил публиковать все классы и методы каждого класса, предназначенные для внешнего использования (его API), и все остальное частное.

Со временем вы будете развивать смысл для того, чтобы сделать некоторые классы private-private и когда объявлять определенные методы, защищенные для использования в подклассах.

6
задан Lylax 8 October 2012 в 23:03
поделиться

3 ответа

У вас нет неявного доступа к атрибутам внутри методов в 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.

9
ответ дан Ben 23 August 2018 в 20:43
поделиться

currentid - атрибут экземпляра, поэтому используйте self.currentid вместо currentid:

def on_close(self):
        global connections
        print "WebSocket " + str(self.currentid) + " closed"
        del connections[self.currentid]
0
ответ дан defuz 23 August 2018 в 20:43
поделиться

currentid должен быть self.currentid, поскольку это переменная класса.

3
ответ дан ronak 23 August 2018 в 20:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: