2011-02-23 91 views
5

爲什麼不`噸這項工作:問題使用with語句

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

class Y: 
    x = X() 

y = Y() 
with y.x as z: 
    print z.var1 

我得到:

print z.var1 
AttributeError: 'NoneType' object has no attribute 'var1' 

回答

14

變化X

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

with定義分配收益__enter__()方法的值到as後的名字。您的__enter__()返回None,它被分配到z

我也將類更改爲新風格的類(這對於使其工作並不重要)。

+0

欲瞭解更多信息,請參閱PEP 343 [鏈接](http://www.python.org/dev/peps/pep-0343/),它很好地描述了語法 – Voo 2011-02-23 16:05:57

4

上下文經理見docs

__enter__( )輸入運行時上下文並返回無論該對象或 相關運行 上下文中的另一個對象。此 方法返回的值綁定到 as語句的as標識符,該語句使用 此上下文管理器。返回自身的 上下文管理器的示例是 文件對象。文件對象從__enter__()返回 本身允許 open()在with語句中用作上下文 表達式。

的上下文管理器, 返回一個相關對象的一個​​例子是由 decimal.Context.get_manager()返回的一個 。這些 管理器將激活的小數點 上下文設置爲原始 小數上下文的副本,然後返回 副本。這允許將 更改爲 with with語句的 正文中的當前小數上下文,而 不影響 語句之外的代碼。

__enter__方法不返回任何東西,這是一樣的返回None