有没有办法将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'
答案 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源本身就是一个很好的参考,可以帮助您