我正在尝试运行此代码:
class A:
def __enter__(self):
print "enter"
def __exit__(self, *args):
print "exit"
def __init__(self, i):
self.i = i
with A(10) as a:
print a.i
我收到了这个错误:
enter
exit
Traceback (most recent call last):
File ".last_tmp.py", line 9, in <module>
print a.i
AttributeError: 'NoneType' object has no attribute 'i'
我的语法有什么问题?
答案 0 :(得分:10)
您需要从self
返回__enter__
:
def __enter__(self):
print "enter"
return self
您的with
声明实际上等同于:
a = A(10).__enter__() # with A(10) as a:
try:
print a.i # Your with body
except:
a.__exit__(exception and type)
raise
else:
a.__exit__(None, None, None)
因此,您需要返回一些内容,否则a
的值为None
(默认返回值),None
没有名为i
的属性,所以你得到一个AttributeError
。
答案 1 :(得分:2)
对象的__enter__
方法的返回值是as
关键字后面的名称。您的方法(隐式)返回None
,导致您看到的错误。相反,__enter__
应返回self
,以便将A(10)
创建的对象分配给a
。