首页 > 解决方案 > 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语句起作用?

(我在制作模拟对象时遇到了这个问题,原始代码比上面的代码更理智。)

标签: pythonwith-statement

解决方案


推荐阅读