gpt4 book ai didi

python - 如何创建基于 file.io 的类

转载 作者:太空宇宙 更新时间:2023-11-04 00:39:44 28 4
gpt4 key购买 nike

我正在编写一个模块,可以在几种不同的文件格式之间进行转换(例如 vhdl 到 verilog,excel 表到 vhdl 等)。它并不难,但是有很多特定于语言的格式需要做。我刚刚想到,一种优雅的方法是通过在 file.io 上构建一个类来为每种文件格式类型设置一个类类型。该类将继承文件的方法,但也能够读取或写入该文件的特定语法。我找不到文件 io 父类(super class)的任何示例以及如何编写它。我的想法是实例化它(打开文件)我可以使用:

my_lib_file = Libfile(filename, 'w')

为了向 libfile 写入一个简单的参数,我可以使用类似的东西

my_lib_file.simple_parameter(param, value)

这样的类将以一种简洁的方式将我目前拥有的许多特定于文件的功能联系在一起。实际上,我更希望能够将类实例化为 with 语句的一部分,例如:

with Libfile(filename, 'w') as my_lib_file:
for param, value in my_stuff.items():
my_lib_file.simple_parameter(param, value)

最佳答案

这是错误的思考方式。

你继承是为了被重用。基类提供其他人可以使用的接口(interface)。对于类文件对象,主要是readwrite。但是,您只想调用另一个函数 simple_parameter。直接调用 write 可能会弄乱格式。

您真的不希望它成为类似文件的对象。您希望在用户调用 simple_parameter 时写入文件。实现应该委托(delegate)给成员类文件对象,例如:

class LibFile:
def __init__(self, file):
self.file = file

def simple_parameter(self, param, value):
self.file.write('{}: {}\n'.format(param, value))

这很容易测试,因为您可以传入任何支持 write 的内容:

>>> import sys
>>> lib = LibFile(sys.stdout)
>>> lib.simple_parameter('name', 'Stephen')
name: Stephen

编辑:

如果你真的想让类管理文件的生命周期,你可以提供一个关闭函数并使用 closing上下文管理器:

class Formatter:
def __init__(self, filename, mode):
self.file = open(filename, mode)

def close(self):
self.file.close()

用法:

class LibFormatter(Formatter):
def simple_parameter(self, param, value):
self.file.write('{}: {}\n'.format(param, value))

from contextlib import closing

with closing(LibFormatter('library.txt', 'w')) as lib:
... # etc

第二次编辑:

如果你不想使用closing ,您可以编写自己的上下文管理器:

class ManagedFile:
def __init__(self, filename, mode):
self.file = open(filename, mode)

def __enter__(self):
return self

def __exit__(self, *args):
self.close()

def close(self):
self.file.close()

用法:

class LibFormatter(ManagedFile):
def simple_parameter(self, param, value):
self.file.write('{}: {}\n'.format(param, value))

with LibFormatter('library.txt', 'w') as lib:
... # etc

关于python - 如何创建基于 file.io 的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42387418/

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