Это не 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 довольно хорошо ссылаетсяпомочь вам в пути.