gpt4 book ai didi

python - 在python的自定义类中实现 'with object() as f'的使用

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

我必须在 python 中打开一个类似文件的对象(它是通过/dev/的串行连接)然后关闭它。这在我类的几种方法中多次完成。我的做法是在构造函数中打开文件,然后在析构函数中关闭它。不过我遇到了一些奇怪的错误,我认为这与垃圾收集器等有关,我仍然不习惯不知道我的对象何时被删除=\

我这样做的原因是因为每次打开它时我都必须使用带有一堆参数的 tcsetattr ,而且到处都这样做很烦人。所以我想实现一个内部类来处理所有这些,所以我可以用它来做
with Meter('/dev/ttyS2') as m:

我在网上找了一个关于如何实现 with 语法的真正好的答案。我看到它使用 __enter__(self)__exit(self)__ 方法。但是我所要做的就是实现这些方法并且我可以使用 with 语法吗?还是还有更多?

是否有关于如何执行此操作的示例或一些关于它如何在文件对象上实现的文档,我可以查看?

最佳答案

这些方法几乎是您使用 with 语句使对象工作所需的全部。

__enter__ 中,您必须在打开并设置文件对象后返回它。

__exit__ 你必须关闭文件对象。写入它的代码将在 with 语句体中。

class Meter():
def __init__(self, dev):
self.dev = dev
def __enter__(self):
#ttysetattr etc goes here before opening and returning the file object
self.fd = open(self.dev, MODE)
return self
def __exit__(self, type, value, traceback):
#Exception handling here
close(self.fd)

meter = Meter('dev/tty0')
with meter as m:
#here you work with the file object.
m.fd.read()

关于python - 在python的自定义类中实现 'with object() as f'的使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3774328/

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