Литье розеток к подтипам

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() 

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

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

  • 2
    Я предлагаю вам сделать обработчик сообщений с сокетом. Не наследуй, сочиняй.
Теги:
sockets

2 ответа

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню