1. 程式人生 > >python中__enter__與__exit__和with的關係及作用

python中__enter__與__exit__和with的關係及作用

有些事情,可能需要做些初始化操作,使用完成後需要收尾操作,對於此情況,with就能很好的派上用場了,舉個栗子:

class CallFun(object):

    def __init__(self, name):
        print "__init__"
        self.name = name

    def runs(self):
        print "runs呼叫了", self.name

    def __enter__(self):
        print "__enter__"
        return self

    def __del__(self):
        print "__del__"

    def __exit__(self, exc_type, exc_val, exc_tb):
        print '__exit__'
        
def calls(name):
    return CallFun(name)
    
with calls("cz9025") as call:
    call.runs()

看下執行結果:

__init__
__enter__
runs呼叫了 cz9025
__exit__
__del__

首先例項化程式時,會先執行構造方法;
在執行with語句時,先執行了enter方法;
操作完成後,即with方法執行完成,
自動呼叫了exit方法:
    其中exit中幾個引數,
exc_type異常型別;exc_val異常內容;exc_tb異常所在位置。
del析構方法,函式結束後自動執行。

舉個異常栗子:
在runs方法中新增一個異常

    def runs(self):
        self.name = 1/0
        print "runs呼叫了", self.name

列印結果:

__init__
__enter__
__exit__
exc_type=>>> <type 'exceptions.ZeroDivisionError'>
exc_val=>>> integer division or modulo by zero
exc_tb=>>> <traceback object at 0x00000000031B9808>
__del__