当前位置: 首页 > 面试题库 >

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

郎曾笑
2023-03-14
问题内容

我必须在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.fd
    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.read()


 类似资料:
  • 问题内容: 有什么办法可以从类声明中引用类名称?一个例子如下: 我有一个读取此信息并进行一些设置的元类,基类实现了一些常用的保存内容。我希望能够创建像这样的递归定义,但是到目前为止,在我的实验中,我一直无法获得想要的效果,通常会遇到“未定义计划”错误。我了解发生了什么,该类的名称不在该类的范围内。 问题答案: 我有一个元类,可以读取此信息并进行一些设置 大多数使用元类的框架都提供了一种解决此问题的

  • 以下代码不能按预期工作。显然,我不能在类定义中使用类自己的类型: 运行它的结果是: 此外,使用检查代码会返回: 如何将此代码更正为对Python和mypy有效?

  • 我有一个名为 Expect 的类,在你实例化它之后,你可以构建一个数据结构(为了简单起见,假设它是一棵树)。然后调用 run 方法,该方法遍历树,在每个节点上执行一些操作。这些操作需要一些时间才能完成,以便将来返回最终结果。在伪代码中,它类似于: 我想用它们通常的签名实现map和flatmap,但是它们作为参数接收的函数必须对将来返回的值进行操作。我看不出有任何方法可以实现这一点。

  • 问题内容: 我想使用该函数在滚动窗口的基础上应用自己的自定义函数。 但是我的函数需要两个参数,并且还具有两个输出。这可能吗? 下面是一个最小的可复制示例… 导致错误…因为gm需要两个参数… 任何帮助将不胜感激… 编辑 按照Jeff的评论,我已经取得了进步,但仍在为两个或多个列输出而苦苦挣扎,因此,如果我改为创建一个新函数(如下),该函数仅返回两个随机数(与上一个计算无关),而不是v的最后一行,出现

  • 问题内容: 我要实现ActionBar必须如下所示的自定义: 所以问题: 如何实现类似自定义视图的按钮:仅显示一些图像? 如何在顶部绘制一条线? 以及如何实现不带分隔线的按钮:在上添加标签或添加什么? 问题答案: 如果要使用ActionBarAPI,这几乎与你将获得的接近。我不确定你是否可以在ActionBar不进行奇怪的Window黑客操作的情况下在其上方放置一个色带,这是不值得的。至于更改Me

  • 问题内容: 我想将Python的内置set类与我创建的自定义类一起使用。如果要创建包含自定义类实例的集合,我需要实现哪些功能以便执行测试,例如set_a-set_b? 问题答案: 它将开箱的,但是,可能有情况下,如果是有意义的过载,和。默认情况下,将比较对象的身份。这可能不是您想要的。在这种情况下,您必须注意相等的对象具有相同的哈希值,理想情况下,不相等的对象具有不同的哈希值(尽管这不是必需的,但