python - python上下文协议:为什么__enter__和__exit__方法不能在对象中定义?
问题描述
我的理解是,为了让这个片段起作用:
with some_obj:
# do something
some_obj
对象必须有和__enter__
方法__exit__
。这或多或少是唯一的要求。
以下代码演示了这是不正确的:
class X:
pass
def my_enter(*args, **kwargs):
print("enter ", args, kwargs)
def my_exit(*args, **kwargs):
print("exit ", args, kwargs)
some_obj = X()
some_obj.__enter__ = my_enter
some_obj.__exit__ = my_exit
with some_obj:
print("inside with")
即使上面的代码some_obj
显然具有属性,也__enter__
失败了:
Traceback (most recent call last):
File "tst_with.py", line 17, in <module>
with some_obj:
AttributeError: __enter__
有趣的是,如果我将向对象添加方法的两行替换为以下内容:
X.__enter__ = my_enter
X.__exit__ = my_exit
一切都好。
是否有任何理由说明具有这些魔术方法的对象不足以让with
语句起作用?
(我在制作模拟对象时遇到了这个问题,原始代码比上面的代码更理智。)
解决方案
推荐阅读
- javascript - Google Script - 将文档导出为 PDF
- android - Xamarin android Manifest 在构建时被替换。唯一的解决方案似乎是修复视觉工作室
- python - 使用 Pandas 将 Python 创建的数据透视表写入 Excel 文档
- vb.net - 在 vb.net 中将数据从一种形式传递到另一种形式
- php - 使用 PHP 从 iCal 检索事件列表
- java - 无法弄清楚为什么在使用 java.localdate 设置月份时出现空指针异常
- typescript - 自动生成 graphql 解析器签名
- python - 尝试从已安装的包中导入模块时出错
- excel - 工作表更改
- c# - AutoMapper 将字符串集合映射到另一个集合中的集合的属性