使用上下文管理器时,对象变为无

Weh*_*olt 13 python with-statement

为什么这不起作用:

class X:
    var1 = 1
    def __enter__(self): pass
    def __exit__(self, type, value, traceback): pass

with X() as z:
    print z.var1
Run Code Online (Sandbox Code Playgroud)

我明白了:

print z.var1
AttributeError: 'NoneType' object has no attribute 'var1'
Run Code Online (Sandbox Code Playgroud)

Sve*_*ach 23

将定义更改X

class X(object):
    var1 = 1
    def __enter__(self):
        return self
    def __exit__(self, type, value, traceback):
        pass
Run Code Online (Sandbox Code Playgroud)

with将方法的返回值赋给__enter__()后面的名称as.你的__enter__()退回None,被分配给z.

我还将类更改为新类(这对于使其工作并不重要).


bgp*_*ter 5

请参阅上下文管理器文档

__enter__( )输入运行时上下文,然后返回该对象或与运行时上下文相关的另一个对象。使用此上下文管理器,此方法返回的值绑定到with语句的as子句中的标识符。返回自身的上下文管理器的一个示例是文件对象。文件对象从中返回,__enter__()从而可以 open()在with语句中用作上下文表达式。

返回相关对象的上下文管理器的一个示例是所返回的对象 decimal.Context.get_manager()。这些管理器将活动的十进制上下文设置为原始十进制上下文的副本,然后返回该副本。这允许对with语句主体中的当前十进制上下文进行更改,而不会影响with语句之外的代码。

您的__enter__方法不返回任何内容,与returning相同None