编写一个只能用作上下文管理器的Python类[重复]

2023-12-28

Python 中有没有一种方法可以编写一个除非与 with 语句一起使用否则会出错的类?

# Okay:
with Foo() as f1:
    f1.func1()
    f1.func2()

# Not okay:
f2 = Foo()
f2.func1()

我可以手动完成:有__enter__设置一个标志并让所有其他方法检查该标志。但有更好的方法吗?

以下是不太可能的方式的代码:

class Foo(object):
    def __init__(self):
        self._entered = False

    def __enter__(self):
        self._entered = True
        return self

    def _verify_entered(self):
        if not self._entered:
            raise Exception("Didn't get call to __enter__")

    def __exit__(self, typ, val, traceback):
        self._verify_entered()
        print("In __exit__")

    def func1(self):
        self._verify_entered()
        # do stuff ...

    def func2(self):
        self._verify_entered()
        # do other stuff

从技术上讲,我认为 agf 是正确的,因为您可以使用元类来自动化这些东西。但是,如果我正确理解其背后的基本动机,我会建议采用不同的方式。

假设你有一个Payload您想要通过上下文管理器保护的类。在这种情况下,您只需创建一个返回它的上下文管理器:

# This should go in a private module.
class Payload(object):
    def __init__(self):
        print 'payload ctor'

# This should go in the public interface.
class Context(object):
    def __init__(self):
        # Set up here the parameters.
        pass

    def __enter__(self):
        # Build & return a Payload object
        return Payload()

    def __exit__(self, exc_type, exc_val, exc_tb):
        # Cleanup
        pass

with Context() as f:
    # f here is a Payload object.

如果你隐藏Payload在私有模块中,你很好。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

编写一个只能用作上下文管理器的Python类[重复] 的相关文章

  • 字幕重新格式化以完整句子结尾

    我有以下 srt 字幕 文件 import pysrt srt 01 00 02 14 000 gt 00 02 18 000 I understand how customers do their choice So 02 00 02 1
  • 使用 os.popen 在 python 中创建列表

    以前 我已经能够使用类似于以下内容的命令创建列表 os popen ls fits gt samplelist 现在 我尝试通过按编号将文件分组来将文件组织到列表中 这些文件的命名如下 Name 0000 J fits Name 0001
  • 如何使用 .ui 文件创建小部件?

    我想在 MainWindow 内创建一个小部件 该小部件从使用 QtDesigner 创建的文件中获取其设计 我创建的 ui 文件是test ui 我有一个继承自的 MainWindow 实例QMainWindow这将创建一个堆叠小部件里面
  • 仅选择多索引 DataFrame 的一个索引

    我正在尝试仅使用多索引 DataFrame 中的一个索引创建一个新的 DataFrame A B C first second bar one 0 895717 0 410835 1 413681 two 0 805244 0 813850
  • ModuleNotFoundError:pip install后没有名为“requests”的模块[重复]

    这个问题在这里已经有答案了 我知道以前曾有人问过类似的问题 但我找不到问题的解决方案 尝试导入请求后 我收到以下错误消息 C Users Jm PycharmProjects Test venv Scripts python exe C U
  • 获取 Pandas Dataframe 中列名的排名

    我将客户 ID 与他们最常购买的表演类型进行比较 Genre Jazz Dance Music Theatre Customer 100000000001 0 3 1 2 100000000002 0 1 6 2 100000000003
  • 如何访问数据框中的一行嵌套字典

    我有一个 json 文件 如下所示 file name main question no Q 1 question what is answer user John comment It is defined as value number
  • Google Cloud Functions 中的 Python

    Google Cloud Functions 可以使用 sklearn pandas 等包处理 python 吗 如果是这样 有人可以向我指出如何做到这一点的资源方向 我已经搜索了一段时间 似乎这是不可能的 我找到的只是将基本 python
  • Pandas datetools模块错误

    我正在尝试从 pandas datetools 调用模块 但收到错误消息 指出 mofule 对象没有我所调用的名称的属性 想知道是否有人可以阐明这个问题 下面是我尝试使用的代码 import blpapi import pandas as
  • pytest动态生成测试方法

    您好 我如何为列表或文件数量动态生成测试方法 假设我有 file1 file2 和 filen 其输入值为 json 现在我需要对多个值运行相同的测试 如下所示 class Test File unittest TestCase def t
  • 像多米诺骨牌一样对 Python 中的元组进行排序/查找顶点连接

    我有一个像这样的整数元组列表 L 1 2 7 6 2 3 8 5 3 8 5 7 每对定义两个顶点之间的边 我想找到顶点连接性 没有循环 元组总是像多米诺骨牌一样唯一地链接起来 因此在这种情况下 排序列表应如下所示 L sorted 1 2
  • 为什么在我的例子中 For 循环比 Map、Reduce 和 List 理解更快

    我编写了一个简单的脚本来测试速度 这就是我发现的结果 实际上 for 循环在我的例子中是最快的 这真的让我感到惊讶 请查看下面 正在计算平方和 这是因为它在内存中保存列表还是有意为之 谁能解释一下这一点 from functools imp
  • Django的注释框架和CSRF

    据我了解 Django的评论框架 https docs djangoproject com en 1 4 ref contrib comments 专为匿名公众评论而设计 就像您通常在博客或文章下面看到的那样 换句话说 任何人都可以发表评论
  • Python 类中的继承顺序

    我有课ExampleSim它继承自基类Physics class Physics object arg1 arg1 def physics method print physics method class ExampleSim Physi
  • 避免 Python 3 的多处理队列中的竞争条件

    我正在尝试找到大约 61 亿 自定义 物品的最大重量 并且我想通过并行处理来完成此操作 对于我的特定应用程序 有更好的算法不需要我迭代超过 61 亿个项目 但解释它们的教科书超出了我的能力范围 我的老板希望在 4 天内完成此任务 我认为我公
  • 从 pandas 数据帧中提取阶段/段以及相应的时间戳

    我有以下数据框 Sleep Stage Time hh mm ss Event Duration s 0 SLEEP S0 23 27 14 SLEEP S0 30 1 SLEEP S0 23 27 44 SLEEP S0 30 2 SLE
  • PyQt4 QPalette 不工作

    btn QtGui QPushButton Button self palettes btn palette palettes setColor btn backgroundRole QtCore Qt green btn setPalet
  • Pandas .apply() 函数中的异常处理

    如果我有一个数据框 myDF DataFrame data 11 11 22 2A 33 33 columns A B 给出以下数据帧 从 stackoverflow 开始 对于数据帧的图像没有足够的声誉 A B 0 11 11 1 22
  • Python BeautifulSoup 循环表数据

    这里对 Python 非常陌生 我正在尝试从此页面捕获一些数据这一页 https us diablo3 com en item helm 我正在尝试获取两个列表中捕获的项目名称和项目类型 我稍后可以弄清楚如何将它们连接到一张表中 任何帮助都
  • 缩放插图中不同的 x 和 y 比例,matplotlib

    我正在尝试使用 matplotlib 制作插图 目前我有类似最后一个答案的内容如何缩放图像的一部分并插入到 matplotlib 中的同一图中 https stackoverflow com questions 13583153 how t

随机推荐