Уведомления

Группа в Telegram: @pythonsu

#1 Март 10, 2012 09:34:04

superantonio
От:
Зарегистрирован: 2012-03-10
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

Многопоточность и класс/экземпляр

Доброе утро, возникла необходимость написать на Python сетевую часть ПО, т.к. язык не основной для меня столкнулся с трудностями, вопросы может достаточно банальны, но все же решусь их задать -)

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

Может не совсем понятно сформулировал, но готов прояснить -)
Спасибо.



Офлайн

#2 Март 10, 2012 13:22:12

Soteric
От:
Зарегистрирован: 2010-09-19
Сообщения: 352
Репутация: +  20  -
Профиль   Отправить e-mail  

Многопоточность и класс/экземпляр

По-моему стоит пояснить. Кто кому события должен слать и почему инициатор события не может иметь ссылку на получателя?



Офлайн

#3 Март 10, 2012 13:46:07

superantonio
От:
Зарегистрирован: 2012-03-10
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

Многопоточность и класс/экземпляр

Есть класс самого сервера и таймера:

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, общий массив пользователей получается на уровне каждого пользователя, почему не на уровне класса (ведь в массиве все пользователи)?

Спасибо.



Офлайн

#4 Март 10, 2012 14:15:15

Soteric
От:
Зарегистрирован: 2010-09-19
Сообщения: 352
Репутация: +  20  -
Профиль   Отправить e-mail  

Многопоточность и класс/экземпляр

Может быть так?

class Server(object):
def __init__(self):
self.timer = Timer(self.tick)

def tick(self):
self.clients = sorted(self.clients)
superantonio
И еще вопрос по self, я его не совсем понял в python, общий массив пользователей получается на уровне каждого пользователя, почему не на уровне класса (ведь в массиве все пользователи)?
У каждого экземпляра Server есть свой массив clients.



Отредактировано (Март 10, 2012 14:31:51)

Офлайн

#5 Март 10, 2012 14:38:10

superantonio
От:
Зарегистрирован: 2012-03-10
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

Многопоточность и класс/экземпляр

Спасибо, но когда я вижу это я не совсем понимаю тогда что происходит (метод в классе Server):

def connectionMade(self):
self.clients.append(self)

В self.clients добавляется self, что здесь вообще self?



Офлайн

#6 Март 10, 2012 14:57:48

Soteric
От:
Зарегистрирован: 2010-09-19
Сообщения: 352
Репутация: +  20  -
Профиль   Отправить e-mail  

Многопоточность и класс/экземпляр

self это ссылка экземпляра на самого себя. Аналог ‘this’ в Java и C#. Но там каждый раз писать ‘this’ необязательно, а здесь необходимо.



Офлайн

#7 Март 10, 2012 20:39:17

superantonio
От:
Зарегистрирован: 2012-03-10
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

Многопоточность и класс/экземпляр

Soteric, большое спасибо за потраченное на меня время :)



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version