使用 python3 中现有的超类实例初始化子类

J.H*_*orr 5 python sockets inheritance superclass python-3.x

我正在用 python 编写我自己版本的套接字类。我想知道是否有一种方法使用它的方法初始化子类__init__,而是使用套接字类的现有实例初始化它。

基本上,我想做的是从套接字类继承,并覆盖该accept()方法以返回我自己的类而不是套接字类的对象。

为了解决这个问题,我想实现在__init__自定义套接字类的方法中设置基本套接字的可能性,该方法将套接字的实例作为参数,并使用现有的套接字实例创建自定义套接字类的新实例。套接字类,或使用类方法执行相同操作fromSocket()

我现在的问题是如何将套接字类的现有实例设置为我自己的套接字的超类,而不使用属性来包含套接字对象?(这在Python中可能吗?)

我发现的所有其他相关问题更多地是关于如何在运行时更改超类。我可能在某个地方忽略了答案,但我找不到它。

我的代码看起来像这样:

import socket
class MySocket(socket.socket):
    def __init__(self, sock:socket.socket=None):
        if sock != None:
            # initialize using existing instance contained in sock
            # How? (My question)
        else:
            super().__init__() # Default conf is enough for now
    def accept(self):
        s, addr = super().accept()
        return MySocket(sock=s) # <= This is what I want to do
Run Code Online (Sandbox Code Playgroud)

我想这样称呼它:

s = MySocket()
# Call bind and listen, left out because it doesn't matter here
client, addr = s.accept() 
# Client is an instance of socket.socket, but it should be MySocket
Run Code Online (Sandbox Code Playgroud)

Mar*_*nen 2

这是 的源代码socket.accept()

老实说,这看起来像是socket类上的一个错误,他们对其进行了硬编码以创建一个新实例socket

sock = socket(self.family, self.type, self.proto, fileno=fd)
Run Code Online (Sandbox Code Playgroud)

当它可能应该获取类型self时:

sock = type(self)(self.family, self.type, self.proto, fileno=fd)
Run Code Online (Sandbox Code Playgroud)

这似乎是通过多种方法完成的,看起来您最好的机会是将所有属性从返回的套接字手动复制到您的自定义实例。该dup()方法希望是正确的,因此我们可以创建一个重复其功能的类方法:

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
Run Code Online (Sandbox Code Playgroud)