Ответ Дэвида дает смысл каждого модификатора доступа. Что касается использования каждого из них, я бы предложил публиковать все классы и методы каждого класса, предназначенные для внешнего использования (его API), и все остальное частное.
Со временем вы будете развивать смысл для того, чтобы сделать некоторые классы private-private и когда объявлять определенные методы, защищенные для использования в подклассах.
У вас нет неявного доступа к атрибутам внутри методов в 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
.
currentid
- атрибут экземпляра, поэтому используйте self.currentid
вместо currentid
:
def on_close(self):
global connections
print "WebSocket " + str(self.currentid) + " closed"
del connections[self.currentid]
currentid
должен быть self.currentid
, поскольку это переменная класса.