2013-07-18 3 views
2

Я использую класс LineReceiver в библиотеке Twisted python. Я вижу из исходного кода LineReceiver, что mdethods setLineMode и setRawMode устанавливают переменную класса line_mode равным 1 или 0. Также существует другая переменная класса, называемая _buffer, которую я предполагаю хранить данные, отправленные по соединению.Переменные класса Python Twisted LineReceiver?

Но почему переменные класса line_mode и _buffer? Разве это не означает, что если моя фабрика создает несколько экземпляров LineReceiver (или протоколов, которые наследуют от LineReceiver), если я установил line_mode = 1, тогда все экземпляры протокола LineReceiver переходят в линейный режим? И разве это не означает, что для ВСЕХ экземпляров LineReceiver существует только один _буфер? Я не понимаю. Может ли кто-нибудь объяснить это?

ответ

0

Хорошо, я понял. Да, класс LineReceiver действительно имеет переменные класса _buffer и line_mode. Однако то, что оно фактически использует внутри методов LineReceiver, это переменные экземпляра с тем же именем. Когда python создает экземпляр любого класса с переменными класса, он также создает переменные экземпляра с тем же именем, и эти переменные экземпляра имеют любое значение, которое имела переменная класса при создании экземпляра.

Так, например, экземпляр может проверить self.line_mode, который является значением для переменной экземпляра line_mode. Если это первая переменная экземпляра, она должна иметь то же значение, что и соответствующая переменная класса. Но если вы измените его, оно получит новое значение, отличное от значения переменной класса. Я предполагаю, что это всего лишь часть скрытого материала, который продолжается под капотом на питоне.

Вы всегда можете получить значение переменной класса line_mode, обратившись к LineReceiver.line_mode.

Просто подумал, что напишу это на тот случай, если кто-либо еще (как и я) станет новым для python и перекручен и запутался.

+0

Пока вы не попытаетесь изменить (присвоить) 'self.line_mode'; он относится к одному и тому же объекту для всех экземпляров класса, то есть Python не создает отдельные переменные экземпляра для атрибутов класса, именно так работает поиск атрибутов. Вы можете продемонстрировать это, используя изменяемый объект, такой как список как атрибут класса: если вы вызываете 'self.the_list.append (1)'; все остальные экземпляры будут видеть измененное значение (потому что это тот же объект). – jfs

Смежные вопросы