#魔術方法(會話管理)

weixin_34353714發表於2018-06-01

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

相關文章