问题描述
免责声明:标题中的 subclass 一词不正确,但这是对仅适用于pytho2的旧解决方案的引用,我不知道有什么更好的描述方式。
代码应像以前一样完全,但是在文件打开时(打开之前或之后)以及调用某些方法(例如,之前的close()
)时会触发一些其他行为或关闭后)
与我之前所说的完全一样,如果我将全局open(
替换为MyFile(
(当然还要添加{{1 }}
MyFile
不是类,因此不能被子类化。但是,仅python2的旧版本是通过 subclassing open
实现的(这也不是AFAIK类,但是该解决方案有效)
仅适用于python2的旧解决方案:
file
使用它的方式是:
class MyFile(file):
def __init__(self,fname,mode,special_param=False):
# next line would be nice,but is not essential
# do_something_special_before_opening(self,special_param)
super(MyFile,self).__init__(fname,mode)
do_something_special_after_opening(self,special_param)
def close(self):
super(MyFile,self).close()
do_something_special_after_closing(self)
或
from mymodule import MyFile
# and then use MyFile in the rest of the file
由于from mymodule import MyFile as open
# keep the rest of the file unchanged
在python中不再存在。
关于SO(Porting a sub-class of python2 'file' class to python3)已有答案
但是这不能回答我的问题,因为它建议从file
继承,因为它希望写入io.FileIO
而不是bytes
。
在python3中实现这种功能的最佳方法是什么(适用于Linux和Windows)
在python3中,str
的结果并不总是属于同一类。
示例:
如果以文本模式打开,则返回open()
对象。如果以二进制写模式打开,则返回_io.TextIOWrapper
或_io.BufferedWriter
。如果使用_io.BufferedReader
以二进制模式打开,则返回buffering=0
。
因此,一种选择可能是子类_io.FileIO
,_io.TextIOWrapper
,_io.BufferedWriter
,_io.BufferedReader
,...并创建一个返回这些子类之一的工厂。
但是我想知道是否还有一种更优雅的方式。通过上述方法,我不得不创建一些子类并重新实现open的整个逻辑,从而确定用于哪种参数组合的类。
也许猴子修补有一些技巧?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)