这是源代码socket.accept() https://github.com/python/cpython/blob/master/Lib/socket.py#L205-L219.
老实说,这看起来像是一个错误socket
类,他们对其进行硬编码以创建一个新实例socket
:
sock = socket(self.family, self.type, self.proto, fileno=fd)
当它可能应该获取类型时self
反而:
sock = type(self)(self.family, self.type, self.proto, fileno=fd)
这似乎是通过多种方法完成的,看起来您最好的机会是将所有属性从返回的套接字手动复制到您的自定义实例。这dup() method https://github.com/python/cpython/blob/master/Lib/socket.py#L194-L203希望是正确的,因此我们可以创建一个重复其功能的类方法:
import socket
class MySocket(socket.socket):
@classmethod
def from_socket(cls, sock):
fd = socket.dup(sock.fileno())
my_sock = cls(sock.family, sock.type, sock.proto, fileno=fd)
my_sock.settimeout(sock.gettimeout())
return my_sock