gpt4 book ai didi

python - 在 python 3 中子类化文件对象(以扩展打开和关闭操作)

转载 作者:IT老高 更新时间:2023-10-28 20:52:00 27 4
gpt4 key购买 nike

假设我想在 openclose 时使用额外的操作来扩展内置文件抽象。在 Python 2.7 中这有效:

class ExtFile(file):
def __init__(self, *args):
file.__init__(self, *args)
# extra stuff here

def close(self):
file.close(self)
# extra stuff here

现在我正在考虑将程序更新到 Python 3,其中 open 是一个工厂函数,它可能会从 io 返回几个不同类中的任何一个的实例> 模块取决于它的调用方式。原则上我可以将它们全部子类化,但这很乏味,而且我必须重新实现 open 所做的调度。 (在 Python 3 中,二进制文件和文本文件之间的区别比在 2.x 中更重要,我需要两者。)这些对象将被传递给可能对它们做任何事情的库代码,所以成语制作一个包装 open 的返回值并转发必要方法的“类似文件”的鸭子类型的类将是最冗长的。

谁能建议一种 3.x 方法,在所示的 2.x 代码之外尽可能少地涉及额外的样板代码?

最佳答案

您可以只使用上下文管理器。比如这个:

class SpecialFileOpener:
def __init__ (self, fileName, someOtherParameter):
self.f = open(fileName)
# do more stuff
print(someOtherParameter)
def __enter__ (self):
return self.f
def __exit__ (self, exc_type, exc_value, traceback):
self.f.close()
# do more stuff
print('Everything is over.')

那么你可以这样使用它:

>>> with SpecialFileOpener('C:\\test.txt', 'Hello world!') as f:
print(f.read())

Hello world!
foo bar
Everything is over.

无论如何,对于文件对象(和其他资源),最好使用带有 with 的上下文 block 。

关于python - 在 python 3 中子类化文件对象(以扩展打开和关闭操作),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16085292/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com