您确实应该编写一个包装类并使用它而不是普通的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
但实际上,保持明确可能是这里的方法。