你真的应该写一个包装类,并使用它来代替普通的file
:
class CountingWrapper(object):
def __init__(self, *args, **kwargs):
self.segment_count = 0
self.f = open(*args, **kwargs)
def write(self, *args, **kwargs):
self.segment_count += 1
return self.f.write(*args, **kwargs)
payloadRecon = CountingWrapper('TCPStreamPayload.txt', 'a')
payloadRecon.write('dsfsd')
assert payloadRecon.count == 1
或者,如果你只是试图总结了三行代码,所以你不必不停地重复自己,你可以只写一个包装函数:
segmentCount = 0
def payload_write(f, *args, **kwargs):
global segmentCount
segmentCount += 1
return f.write(*args, **kwargs)
现在,你只需要这一行就可以数和写:
payload_write(payloadRecon, '####TCP PAYLOAD STREAM RECONSTRUCTION. Segment ' + str(segmentCount) + '######' '\n\n\n\n')
assert segmentCount == 1
如果您需要包装多个方法,该类更灵活。但你显然需要委托你关心的任何其他方法。当然,您可以通过__getattr__
动态进行授权。或者你可以使用继承。 (但请记住,在3.x中,班级不是file
,而是io
包中的一个班级,无论如何您不应通过构造函数创建file
或io.whatever
,而是通过open
,会仍然需要编写一个包装厂函数来取代open
。好消息是,这意味着你不需要处理__new__
,只是__init__
)
在3.x中,你甚至可以猴补丁的实例(但这在2.x中不起作用,其中file.write
是只读的):
payloadRecon = open('TCPStreamPayload.txt', 'a')
segmentCount = 0
write_original = payloadRecon.write
def write_and_count(self, *args, **kwargs):
global segmentCount
segmentCount += 1
write_original(self, *args, **kwargs)
payloadRecon.write = write_and_count
但是真的,保持事物明确可能是这里的一种方式。
真的是你的问题,我怎么能记住我的脚本的调用之间'segmentCount'的最后一个值?或者我误解了? – Skurmedel 2013-02-27 20:26:32
难道你不能只调用'payloadRecon.write',然后'segmentCount + = 1'?如果你担心它不能正常工作,你可以在写入过程中尝试一下。你看到什么错误? – GordonsBeard 2013-02-27 20:28:40