python3子类错误'对象没有属性'x'

pieyvz9o  于 2023-02-26  发布在  Python
关注(0)|答案(1)|浏览(137)

我正在使用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还是个新手,所以我对它的理解是相当零散的。
在这方面的任何帮助将不胜感激。

wvt8vs2t

wvt8vs2t1#

with语句不自动提供对上下文管理器的引用;它们提供对上下文管理器的__enter__方法返回的任何内容的引用。

with Foo() as f:
    ...

不等同于(忽略大量细节)

f = Foo()
f.__enter__()
...
f.__exit__()

而是

t = Foo()
f = t.__enter__()
...
t.__exit()

(See有关with实际行为的更全面描述的文档)。
由于Open.__enter__返回的是一个类似文件的对象,而不是Open示例本身,因此不能使用只在Open上定义的方法,可以返回Open示例本身(并提供自己的write方法 Package 器)

class Open:
    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

    def write(self, *args, **kwargs):
        return self.file_obj.write(*args, **kwargs)

    def __exit__(self, *args):
        # and still more custom stuff here
        self.file_obj.close()
        # or here

相关问题