我正在尝试包装文件对象实例的读写操作(特别是readline()
和write()
方法)。
通常,我只是用包装器替换这些函数,有点像这样:
def log(stream):
def logwrite(write):
def inner(data):
print 'LOG: > '+data.replace('\r','<cr>').replace('\n','<lf>')
return write(data)
return inner
stream.write = logwrite(stream.write)
但文件对象的属性是只读的!我怎么能正确包装它们?
(注意:我太懒了包装整个文件对象......真的,我不想错过我没有正确包装的功能,或者可能在未来的python版本中添加的功能)
更多背景信息
我正在尝试自动化与调制解调器的通信,调制解调器的AT命令集通过telnet会话在网络上可用。登录后,我将“抓住”我想要与之通信的模块。在没有活动的一段时间之后,发生超时以释放模块(以便网络上的其他用户可以使用它...我不关心,我是该设备的唯一用户)。自动释放在会话中写入特定行。
我想将readline()
包装在从套接字构建的文件中(参见socket.makefile()
),这样当超时发生时,会抛出一个特定的异常,这样我就可以在任何地方检测到超时在脚本中并做出适当的反应而不会使AT命令解析器复杂化......
(当然,我想这样做是因为超时是非常虚假的,否则我只是用命令提供调制解调器而没有任何副作用只是为了让模块保持活动状态)
(随意提出任何其他方法或策略来实现此效果)
答案 0 :(得分:3)
使用__getattr__
来包装您的文件对象。为您所关注的方法提供修改后的方法。
class Wrapped(object):
def __init__(self, file_):
self._file = file_
def write(self, data):
print 'LOG: > '+data.replace('\r','<cr>').replace('\n','<lf>')
return self._file.write(data)
def __getattr__(self, attr):
return getattr(self._file, attr)
这样,对您未明确提供的属性的请求将被路由到包装对象上的属性,您只需实现所需的属性
logged = Wrapped(open(filename))