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__

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值