我知道How do I override file.write() in Python 3?这样的SO帖子,但是在仔细研究并尝试了建议之后,我仍然很困惑。
我想重写Python 3中的file.write方法,以便可以“编辑”某些单词(用户名,密码等)。
我找到了一个很好的例子,它可以覆盖print以及一般的stdout和stderr http://code.activestate.com/recipes/119404/
问题是它不适用于file.write。如何覆盖file.write?
我在打印时编辑的代码是:
def write(self, text):
for word in self.redacted_list:
text = text.replace(word, "REDACTED")
self.origOut.write(text)
return text
谢谢
答案 0 :(得分:0)
从self.origOut.write(text)
开始,我假设您正在尝试编写一个中间类,该类假装为文件但提供了不同的.write()
方法。
我在发布的代码中看不到任何问题(假设这是您使用的类的一种方法)。您可能写了一个类,却忘了创建它的实例吗?
您是否尝试过编写这样的内容?:
class IAmNoARealFile:
def __init__(self, real_file):
self.origOut = real_file
def __getattr__(self, attr_name): # provide everything a file has
return getattr(self.origOut, attr_name)
def write(self, ...):
...
with open('test.txt', 'w') as f:
f = IAmNotARealFile(f) # did you forget this?
f.write('some text SECRET blah SECRET') # calls IAMNotARealFile.write with your extra code
with open('test.txt') as f:
f = IAmNotARealFile(f)
print(f.read()) # this "falls through" to the actual file object
如果您没有特定的理由,您可能还想以自己的return self.origOut.write()
来.write()
。
请注意,如果您重写open()
以直接返回IAMNotARealFile
:
def open(*args, **kwargs):
return IAMNotARealFile(open(*args, **kwargs))
您将不得不手动提供(某些)“魔术方法”,因为
由于通过语言语法或内置函数进行隐式调用而查找特殊方法时,仍可能会绕过此方法。请参阅特殊方法查找。
-.__getattribute__()
的文档,但也适用于.__getattr__()
为什么?
以这种方式绕过
__getattribute__()
机制为解释器内的速度优化提供了很大的范围,但以牺牲一些特殊方法的灵活性为代价(特殊方法必须在类对象上设置以便被解释程序一致地调用)。
-在special ("magic") method lookup上[代码样式和重点代码]