добавление метода doRead () к существующему объекту сокета - PullRequest
1 голос
/ 04 ноября 2010

есть ли способ добавить метод doRead () к существующему объекту сокета?

сокету нужен метод doRead, чтобы его можно было передать в витую реактор через метод addWriter.

Я попытался использовать метод экземпляра нового модуля, но он не работает ...

>>> c
<socket._socketobject object at 0x7fcb03cc8b40>
>>> c.doRead = new.instancemethod(doRead, c, socket._socketobject)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: '_socketobject' object has no attribute 'doRead'

1 Ответ

2 голосов
/ 04 ноября 2010

Это не new.instancemethod, что здесь не так.Это тот факт, что у вас есть socket._socketobject, экземпляр типа расширения, который не имеет __dict__, поэтому ему нельзя присвоить произвольные новые атрибуты.

Типичный способ создания одного видаобъекта похож на другой вид объекта, чтобы использовать обтекание.Создайте новый класс, который имеет все методы, которые вы хотите, и получает ссылку на ваш сокет.Например:

class Connection:
    def __init__(self, socket, protocol):
        self.socket = socket
        self.protocol = protocol

    def doRead(self):
        try:
            data = self.socket.recv(self.bufferSize)
        except socket.error, se:
            if se.args[0] == EWOULDBLOCK:
                return
            else:
                return main.CONNECTION_LOST
        if not data:
            return main.CONNECTION_DONE
        return self.protocol.dataReceived(data)

Это, конечно, скопировано прямо из Twisted - это решение именно той проблемы, которую вы пытаетесь решить.:)

Повторное внедрение кишок Twisted может быть полезным упражнением, чтобы убедиться, что вы понимаете, как все части работают и сочетаются друг с другом, но когда вы застряли, сам источник Twisted довольно хорошо ссылаетсяпомочь вам в пути.

...