2010-08-21 3 views
1

Я пытаюсь создать свой собственный подкласс socket.socket, который сможет обрабатывать персонализированные сообщения. До сих пор мой код выглядит следующим образом:Ролики для подтипов

self._sockets.append(s) 
    logging.debug("Waiting for incoming connections on port %d" % (port)) 
    while not self.shutdown: 
     inputready,outputready,exceptready = select(self._sockets,[],[]) 
     print "Select returned" 
     for i in inputready: 
      if s == i: 
       # handle the server socket 
       client, address = s.accept() 
       self._sockets.append(client) 
       print "%r , %r" % (client, address) 
      else: 
       # handle all other sockets 
       s.handleMessage() 

так, как вы можете видеть, что я либо acceptin новых соединений, или если он возвращается из другого сокета он позвонит handleMessage на сокете. Теперь проблема заключается в том, что вне курса socket.accept() вернет socket.socket, а не мой подкласс, который реализует функцию handleMessage.

Что было бы самым простым способом получить мой пользовательский класс вместо стандартного socket.socket?

+2

Я предлагаю вам обработать сообщение, которое ** имеет -соединитель **. Не наследуйте, не сочиняйте. – msw

ответ

2

Из вашего описания выясняется, что вы создаете обработчик сообщений, который имеет - сокет (или розетки). При разработке классов has-a указывает состав и делегирование в то время как is-a может указывать наследование.

Так что унаследовать от socket.socket нецелесообразно, и ваш код уже выглядит немного гибридным. Что-то вроде этого действительно грубого псевдокода, вероятно, лучше всего подходит для задачи:

class MyMessageHandler(object): 
    def __init__(self): 
     self.sockets = [...] 

    def wait(self): 
     debug('waiting...') 
     i, o, e = select(...) 
+0

+1: Делегирование здесь имеет больше смысла, чем наследование. –

1

Насколько сложно установить дескрипторы сокетов для сопоставления словаря в ваши объекты оболочки оболочки?

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