我正在使用python3.11,在对File对象进行子类化时遇到了一些问题,我基本上希望能够执行一个写操作,并在每个字符串上附加一个换行符,而不必显式地在每个正在写入的字符串上添加换行符。
因此,我想替换:
with open('filename.txt', 'w') as f:
f.write('some text' + '\n')
与:
with MyOpen('filename.txt', 'w') as outfile:
outfile.wl('some text')
我重用Ethan Furman提交的代码,下面是他的类定义:
class Open(object):
def __init__(self, *args, **kwds):
# do custom stuff here
self.args = args
self.kwds = kwds
def __enter__(self):
# or do custom stuff here :)
self.file_obj = open(*self.args, **self.kwds)
# return actual file object so we don't have to worry
# about proxying
return self.file_obj
def __exit__(self, *args):
# and still more custom stuff here
self.file_obj.close()
# or here
我现在尝试从他的类中派生子类(子类来自"object",它被用作文件对象)。
class MyOpen(Open):
def __init__(self, *args, **kwds):
super().__init__(*args, **kwds)
def wl(self, string):
super().file_obj.writelines(string + '\n')
我使用了前面提到的类。当我运行我的脚本时,我得到了下面的错误:
outfile.wl(f"Input file is {path}")
^^^^^^^^^^
AttributeError: '_io.TextIOWrapper' object has no attribute 'wl'
我对python还是个新手,所以我对它的理解是相当零散的。
在这方面的任何帮助将不胜感激。
1条答案
按热度按时间wvt8vs2t1#
with
语句不自动提供对上下文管理器的引用;它们提供对上下文管理器的__enter__
方法返回的任何内容的引用。不等同于(忽略大量细节)
而是
(See有关
with
实际行为的更全面描述的文档)。由于
Open.__enter__
返回的是一个类似文件的对象,而不是Open
示例本身,因此不能使用只在Open
上定义的方法,可以返回Open
示例本身(并提供自己的write
方法 Package 器)