【发布时间】:2012-09-19 14:07:03
【问题描述】:
我想要一个在写入数据时直接刷新到文件的文件对象,并写了这个:
class FlushingFileObject(file):
def write(self,*args,**kwargs):
return_val= file.write(self,*args,**kwargs)
self.flush()
return return_val
def writelines(self,*args,**kwargs):
return_val= file.writelines(self,*args,**kwargs)
self.flush()
return return_val
但有趣的是,我写它时它并没有刷新,所以我尝试了一些方法,包括:
class FlushingFileObject(object):
def __init__(self,*args,**kwargs):
self.file_object= file(*args,**kwargs)
def __getattr__(self, item):
return getattr(self.file_object,item)
def write(self,*args,**kwargs):
return_val= self.file_object.write(*args,**kwargs)
self.file_object.flush()
return return_val
def writelines(self,*args,**kwargs):
return_val= self.file_object.writelines(*args,**kwargs)
self.file_object.flush()
return return_val
确实冲洗。
为什么子类化file 在这种情况下不起作用?
【问题讨论】:
-
您能展示一下如何测试冲洗吗?因为当我尝试它们时两者都可以正常工作。
-
我实际上将它们分配给
sys.stdout和sys.stderr并运行我拥有的程序,并跟踪文件。对于第一个子类文件,只有在我关闭程序时才会写入输出 -
也是一件奇怪的事情,它找不到我不明白的第二个对象的
__exit__属性?当我尝试将它与with一起使用时,我得到一个AttributeError -
__exit__是代码退出withstatement 时运行时自动调用的函数。为什么它找不到它,我不知道,因为它应该调用你的__getattr__,这反过来又会调用文件对象的__exit__。你运行的是什么版本的 Python? -
@Adam 我正在运行 python 2.7.3-是的,所有其他属性似乎都被转发(甚至
__enter__)但由于某种原因没有退出