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=>>> 
exc_val=>>> integer division or modulo by zero
exc_tb=>>> 
__del__

你可能感兴趣的:(Python)