我希望扩展Python的socket.socket
类,增加一个新属性(特别是一个queue.Queue
,但也可以是其他任何东西)。我正在考虑是使用继承还是组合,但两种方法都存在一个问题,我不确定该如何解决:
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
类型,
我不确定如何将一个转换为另一个。如果有一种简单的面向对象的方式来解决这个问题,我不知道它。
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
无法正常工作。
那么,有没有更好的 Pythonic 方法呢?
编辑:我忘记说我尝试过直接在 `socket.socket` 实例上添加属性:
s = socket.socket(...)
s.queue = queue.Queue()
但我收到一个异常,说对于 'socket.socket',该属性未知。
socket.socket
使用__slots__
,这就是为什么您无法添加属性的原因。这也防止您执行类似s.__class__ = MySocket
的操作...太糟糕了。 - augurar