我在别人的密码里看到的。这是什么意思?
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
我发现很难通过google找到
__enter__
和__exit__
方法的python文档,所以要帮助其他人,这里有一个链接:https://docs.python.org/2/reference/datamodel.html#with-statement-context-managers
https://docs.python.org/3/reference/datamodel.html#with-statement-context-managers
(两个版本的细节相同)
我希望对
__exit__
方法参数有一个清晰的描述。这是缺乏的,但我们可以推断。。。假设
exc_type
是异常的类。它说您不应该重新引发传入异常。这向我们表明,其中一个参数可能是一个实际的异常实例……或者您应该自己从类型和值实例化它?
我们可以通过看这篇文章来回答:
http://effbot.org/zone/python-with-statement.htm
……很明显
value
是一个异常实例。假设
traceback
是一个Pythontraceback对象。如果您知道什么是上下文管理器,那么您就不需要再了解
__enter__
和__exit__
魔术方法。让我们看一个非常简单的例子。在本例中,我在open函数的帮助下打开myfile.txt。try/finally块确保即使发生意外异常,也将关闭myfile.txt。
现在我用打开同一个文件,语句是:
如果您查看代码,我没有关闭文件&;没有try/finally块。因为with语句会自动关闭myfile.txt。您甚至可以通过调用
print(fp.closed)
属性来检查它——该属性返回True
。这是因为open函数返回的文件对象(在我的示例中是fp)有两个内置方法
__enter__
和__exit__
。它也被称为上下文管理器。__enter__
方法在带有块的开头调用,而__exit__
方法在结尾调用。注意:with语句仅适用于支持上下文更改协议的对象,即它们具有__enter__
和__exit__
方法。实现这两种方法的类称为上下文管理器类。现在让我们定义自己的上下文管理器类。
我希望现在您对
__enter__
和__exit__
魔术方法都有了基本的了解。使用这些神奇的方法(
__enter__
,__exit__
)可以实现可以很容易地与with
语句一起使用的对象。其思想是,它使构建需要执行一些“清除”代码的代码变得容易(将其视为
try-finally
块)。Some more explanation here。一个有用的示例可能是数据库连接对象(当相应的“with”语句超出范围时,该对象将自动关闭连接):
如上所述,将此对象与
with
语句一起使用(如果您使用的是Python 2.5,则可能需要在文件顶部执行from __future__ import with_statement
)。PEP343 -- The 'with' statement'写得也不错。
相关问题 更多 >
编程相关推荐