解释Python的'__enter__'和'__exit__' [英] Explaining Python's '__enter__' and '__exit__'
问题描述
我在某人的代码中看到了这一点.是什么意思?
I saw this in someone's code. What does it mean?
def __enter__(self):
return self
def __exit__(self, type, value, tb):
self.stream.close()
from __future__ import with_statement#for python2.5
class a(object):
def __enter__(self):
print 'sss'
return 'sss111'
def __exit__(self ,type, value, traceback):
print 'ok'
return False
with a() as s:
print s
print s
推荐答案
使用这些魔术方法(__enter__
,__exit__
)可以实现易于使用with
语句使用的对象.
Using these magic methods (__enter__
, __exit__
) allows you to implement objects which can be used easily with the with
statement.
这个想法是,它使得构建需要执行一些清理"代码的代码变得容易(将其视为try-finally
块). 此处有更多解释.
The idea is that it makes it easy to build code which needs some 'cleandown' code executed (think of it as a try-finally
block). Some more explanation here.
一个有用的例子可能是数据库连接对象(一旦对应的"with"语句超出范围,它就会自动关闭连接):
A useful example could be a database connection object (which then automagically closes the connection once the corresponding 'with'-statement goes out of scope):
class DatabaseConnection(object):
def __enter__(self):
# make a database connection and return it
...
return self.dbconn
def __exit__(self, exc_type, exc_val, exc_tb):
# make sure the dbconnection gets closed
self.dbconn.close()
...
如上所述,将此对象与with
语句一起使用(如果您使用的是Python 2.5,则可能需要在文件顶部执行from __future__ import with_statement
).
As explained above, use this object with the with
statement (you may need to do from __future__ import with_statement
at the top of the file if you're on Python 2.5).
with DatabaseConnection() as mydbconn:
# do stuff
PEP343-'with'语句'的文字很好也是
这篇关于解释Python的'__enter__'和'__exit__'的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!