#魔术方法(会话管理)

### `__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

你可能感兴趣的:(#魔术方法(会话管理))