将doRead()方法添加到现有套接字对象

时间:2010-11-04 09:55:02

标签: python sockets twisted

有没有办法将doRead()方法添加到现有的套接字对象?

socket需要一个doRead方法才能通过addWriter方法传递给twisted的反应器。

我尝试过使用新模块的实例方法,但它似乎不起作用......

>>> 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 个答案:

答案 0 :(得分:2)

这不是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源本身就是一个很好的参考,可以帮助您