superantonio
Март 10, 2012 09:34:04
Доброе утро, возникла необходимость написать на Python сетевую часть ПО, т.к. язык не основной для меня столкнулся с трудностями, вопросы может достаточно банальны, но все же решусь их задать -)
В параллельном потоке создается таймер, который тикает каждую секунду.
Есть класс ответственный за серверную часть (открытие/закрытие подключений итп, собственно там сущности подключенных пользователей),
отсюда вопрос как сделать что-то типа событий или получить доступ к методам экземпляра этого класса, сущность таймера прописал как поле, но таймер все равно на уровне класса, статичными методы тоже не сделать, потому что доступ к массиву пользователей идет через self.
Может не совсем понятно сформулировал, но готов прояснить -)
Спасибо.
Soteric
Март 10, 2012 13:22:12
По-моему стоит пояснить. Кто кому события должен слать и почему инициатор события не может иметь ссылку на получателя?
superantonio
Март 10, 2012 13:46:07
Есть класс самого сервера и таймера:
class Timer
…
class Server:
timer = Timer(tick) //конструктор принимает callback метод
def tick():
self.clients = sorted(self.clients)
def connectionMade(self):
def connectionLost(self,reason):
def dataReceived(self, data):
В классе сервера создаю экземпляр таймера, соответсвенное могу иметь доступ только к методам самого класса (статическим) Server.
А мне нужно каждый тик вызывать метод tick(), который является экземплярным, каждая сущность класса Server - подключенный пользователь и доступ к массиву всех пользователей идет через self. Вот в чем вопрос -)
И еще вопрос по self, я его не совсем понял в python, общий массив пользователей получается на уровне каждого пользователя, почему не на уровне класса (ведь в массиве все пользователи)?
Спасибо.
Soteric
Март 10, 2012 14:15:15
Может быть так?
class Server(object):
def __init__(self):
self.timer = Timer(self.tick)
def tick(self):
self.clients = sorted(self.clients)
superantonio
И еще вопрос по self, я его не совсем понял в python, общий массив пользователей получается на уровне каждого пользователя, почему не на уровне класса (ведь в массиве все пользователи)?
У каждого экземпляра Server есть свой массив clients.
superantonio
Март 10, 2012 14:38:10
Спасибо, но когда я вижу это я не совсем понимаю тогда что происходит (метод в классе Server):
def connectionMade(self):
self.clients.append(self)
В self.clients добавляется self, что здесь вообще self?
Soteric
Март 10, 2012 14:57:48
self это ссылка экземпляра на самого себя. Аналог ‘this’ в Java и C#. Но там каждый раз писать ‘this’ необязательно, а здесь необходимо.
superantonio
Март 10, 2012 20:39:17
Soteric, большое спасибо за потраченное на меня время :)