gpt4 book ai didi

python - 在python3中使用现有的父类(super class)实例初始化子类

转载 作者:太空宇宙 更新时间:2023-11-03 23:59:07 24 4
gpt4 key购买 nike

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

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

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

我现在的问题是,如何在不使用属性来包含套接字对象的情况下将套接字类的现有实例设置为我自己的套接字的父类(super class)? (这在 python 中甚至可能吗?)

我发现的所有其他相关问题更多是关于如何在运行时更改父类(super class)。我可能在某处忽略了答案,但我找不到它。

我的代码看起来像这样:

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

我想这样调用它:

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

最佳答案

这是 socket.accept() 的源代码.

老实说,这看起来像是 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希望是正确的,因此我们可以创建一个重复其功能的类方法:

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

关于python - 在python3中使用现有的父类(super class)实例初始化子类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56324214/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com