我可以添加自己的方法到从 open() 方法收到的文件对象吗

问题描述 投票:0回答:1

我想添加一个函数

READ
(我对文件对象的内置 read() 方法的实现)到我从
open("filename", "r")
收到的返回的文件对象(我将此返回对象的类名称为 A,因为我不知道它的名字)。

我们可以有一个方法,

open
是我的文件,并返回这个新类型的文件对象,其类(假设是B)继承自类A,并且还具有
READ
作为该对象的成员方法?

myfile = OPEN("filename", "r") # opens and packs the "filename" into the object of class B, and returns this object
myfile.READ(38)  # behaves as I want
myfile.read() # should work
myfile.write() # should work   

替代问题:

考虑这段代码:

fileA = open("filename", "r")
fileA.read(34) #works as normal
fileA.READ() #doesn't work because READ member not defined (i assume it's not defined), but I want this to work in the way I code this new READ method

由于

READ
不起作用,因此我想创建新方法
OPEN
,其中
open
是我的文件,并返回新类类型的文件对象,其中包括
READ
作为其成员。

fileB = OPEN("filename", "r")
fileB.READ(44)  #should work as I would define it
fileB.read(34)  #should work as it would work for fileA.read() in first example
fileB.write(somestring) #should work
python file class inheritance file-handling
1个回答
0
投票

正如评论之一所述,除了打开之外,没有低级的打开文件的方式。但是,在 python 中对文件对象进行子类化。在 python 中,由

open
生成的文件通常是
TextIOWrapper
的实例。这个类可以从
io
模块访问,它允许我们创建一个自定义子类,您可以在其中定义您需要的任何方法。然后,您可以从文件对象中提取所有参数并将它们传递到您的自定义子类中。这是我相信您想要实现的目标的模板代码。

from io import TextIOWrapper
from typing import override


class MyWrapper(TextIOWrapper):

    @classmethod
    def OPEN(cls,file, mode = "r", **kwargs):
        """
        Based on `open`
        """
        return cls.wrap_file(open(file,mode,**kwargs))

    @classmethod
    def wrap_file(cls,file):
        """
        This method turns a file produced by `open`
        into an instance of `MyWrapper`
        """
        newline:str|None = None
        if isinstance(file.newlines,tuple):
            newline = file.newlines[0]
        else:
            newline = file.newlines
        return cls(buffer=file.buffer,encoding=file.encoding,
                   errors=file.errors,line_buffering=file.line_buffering,
                   write_through=file.write_through, newline=newline)
    

    def READ(self):
        """
        Your custom implementation of read.
        
        Additional stuff you want in you implementation.
        """
        return super().read().upper() # arbitrary exaplme

OPEN
调用
open
方法,该方法创建打开的文件,然后将其传递到并返回
wrap_file
wrap_file
从实例强制文件对象
MyWrapper
READ
执行您定义的任何操作。

© www.soinside.com 2019 - 2024. All rights reserved.