### `__enter__`魔术方法:
使用`with`语句的时候,会调用这个魔术方法,这个方法的返回值可以作为`as xx`的值。
示例:
```python
with FileOpener('xxx.txt','w') as fp:
pass
```
### `__exit__(self,exc_type,exc_val,exc_tb)`魔术方法:
1. 执行完这个`with`语句中的代码块或者是这个代码块中的代码发生了异常,就会执行这个方法。可以在这个方法中做一些清理工作。比如关闭文件等。
2. 如果在`with`语句中发生了异常,那么`exc_type`和`exc_val`将会存储这个异常的信息,如果没有任何异常,那么他们的值为`None`。
3. 如果在`with`语句中发生了异常,那么会执行`__exit__`方法,但是如果你不想让这个异常抛出`with`代码块,那么你可以返回`True`,就不会把异常抛出到外面了。
#encoding: utf-8
class FileOpener(object):
def __init__(self,filename,mode):
self.filename = filename
self.mode = mode
def __enter__(self):
self.fp = open(self.filename,self.mode)
print('__enter__')
return self.fp
def __exit__(self, exc_type, exc_val, exc_tb):
self.fp.close()
# print('__exit__')
print(exc_type)
print(exc_val)
print(exc_tb)
# 如果不想抛出异常,那么返回True,会自动的吸收这个异常
return True
with FileOpener('abc.txt','w') as fp:
fp.write('hello world')
a = 1
c = a/0
网友评论