1. 程式人生 > >python上下文管理協議,即with的詳細使用

python上下文管理協議,即with的詳細使用

self. workspace als 部分 觸發 fin 自動清理 all int

一、with obj as f:

#代碼塊...

二、執行流程:

1.with obj --->觸發obj.__enter__(),需要在obj裏寫__enter__(self),在它裏邊寫返回值,返回給 as f

2.with obj as f 等同於 f = obj.__enter__()

3.執行with代碼塊裏的程序

4.執行正常時,順序執行obj中的__exit__()方法,exc_type, exc_val, exc_tb的值都是None.

存在異常時,__exit__()方法中

a. return False返回假時,拋出系統異常。

b. return True 返回假時,吞掉系統異常,自己定制異常信息。

三、它的作用:自動清理/釋放代碼塊中程序占用的資源,無須考慮這些問題

class Foo:
    def __init__(self,aa):
        self.aa = aa
    def __enter__(self):
        print(run enter)
        return self
    def __exit__(self, exc_type, exc_val, exc_tb):
        print(run exit)
        print(exc_type)#異常類 如:NameError
        print(exc_val)#
異常值 如:name ‘myname‘ is not defined print(exc_tb)#追蹤信息 如:Traceback (most recent call last): xxxx return True with Foo(11) as cc: print(cc.aa) print(cc.ff) print(ssss)

常見的異常組成部分

Traceback (most recent call last):(追蹤信息開始)

File "D:/workSpace/purePython3/異常.py", line 1, in <module>

myname(追蹤信息結束)

NameError(異常類): name ‘myname‘ is not defined(異常值)

python上下文管理協議,即with的詳細使用