python中__enter__與__exit__和with的關係及作用
阿新 • • 發佈:2018-11-27
有些事情,可能需要做些初始化操作,使用完成後需要收尾操作,對於此情況,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__