我希望用一个新属性(特别是一个socket.socket,但可以是任何其他属性)扩展Python。我正试图决定是否应该使用继承或组合,但在某一时刻,我不知道如何解决这两个问题:
( A)如果我使用继承,其内容如下:
class MySocket(socket.socket):
def __init__(self, *args, **kwargs):
socket.socket.__init__(self, *args, **kwargs)
self.queue = queue.Queue()当我使用类似的操作时,我会遇到问题
connection, client_address = s.accept()因为套接字的accept方法返回socket.socket类型的对象,而不是MySocket类型的对象,所以我不知道如何将其中一个转换为另一个。如果有一个琐碎的OOP方法来做这件事,我不知道。
( B)如果我用构图代替,以前的问题就会得到解决:
class MySocket(socket.socket):
def __init__(self, true_socket):
self.true_socket = true_socket
self.queue = queue.Queue()我只需要简单地实现这样的东西
def accept(self, *args, **kwargs):
con, cli = socket.socket.accept(self, *args, **kwargs)
return self.__class__(con), cli但我还有另一个问题。当我需要做的时候
readable, writable, exceptional = select.select(inputs, outputs, inputs)select为socket.socket工作。对于A)版本,我希望它能像现在一样工作,但是对于组合,既然MySockets不是socket.socket的实例,select就坏了。
那么,什么是最好的,丙酮主义的方法呢?
编辑:我忘记说我尝试的第一件事是直接将属性添加到`socket.Socket‘的实例中:
s = socket.socket(...)
s.queue = queue.Queue()但我得到了一个异常,该属性对于“socket.Socket”来说是未知的。
发布于 2017-07-20 08:52:59
您可以根据socket.socket.dup()在Lib/socket.py中使用以下内容
import _socket
class MySocket(socket.socket):
def __init__(self, *args, **kwargs):
super(MySocket, self).__init__(*args, **kwargs)
self.queue = queue.Queue
@classmethod
def copy(cls, sock):
fd = _socket.dup(sock.fileno())
copy = cls(sock.family, sock.type, sock.proto, fileno=fd)
copy.settimeout(sock.gettimeout())
return copy现在可以使用构造函数创建新的MySocket,也可以使用MySocket.copy()从现有的socket.socket创建MySocket。注意,在大多数情况下,您应该在创建副本之后关闭原始套接字。
发布于 2017-07-20 07:10:15
也许您应该尝试使用super进行继承
class NewSocket(socket.socket):
def __init__(self):
super(NewSocket, self).__init__()https://stackoverflow.com/questions/45207430
复制相似问题