我的客户端API封装了存储ServerConnection
对的类asyncio.StreamReader/-Writer
中与服务器的连接。 (为简单起见,我不会在下面的代码中使用yield from
或任何其他异步技术,因为它与我的问题无关。)
现在,我想知道将两个流作为ServerConnection
的公共接口的一部分公开,而不是将read()/ write()方法引入ServerConnection
,以便将调用转发到相应的流方法。例如:
class ServerConnection:
def __init__(self, reader, writer):
self.reader = reader
self.writer = writer
VS
class ServerConnection:
def __init__(self, reader, writer):
self._reader = reader
self._writer = writer
def read(self, size):
return self._reader.read(size)
def readline(self):
return self._reader.readline()
def write(self, data):
return self._writer.write(data)
def close(self):
return self._writer.close()
# …further proxy methods…
到目前为止我所知道的优点/缺点:
优点: ServerConnection
绝对是某种双向流,因此让它从StreamRWPair
继承是有意义的。此外,使用server_conn.read()
比server_conn.reader.read()
更方便。
缺点:我需要定义一大堆代理方法。 (在我的例子中,我实际上使用了某种缓冲读取器,它有其他方法,如peek()
等等。)所以我考虑创建一个类似于Python StreamRWPair
的基类io.BufferedRWPair
我的ServerConnection
可以继承。但是,io
模块的Python实现在评论中说明了以下BufferedRWPair
:
XXX这是有用的(与拥有两个独立的IO相比 对象)是值得怀疑的。
最重要的是,我的ServerConnection
类还有其他几种方法,我担心,通过代理,我会混淆其属性命名空间并使其使用不那么明显。