with statement 上下文管理

介绍

with语句适用于对资源进行访问的场合,确保不管使用过程中是否发生异常都会执行必要的“清理”操作,释放资源,比如文件使用后自动关闭、线程中锁的自动获取和释放等

特点

  • 上下文管理器提供了 __enter__()方法和__exit__()方法,在with语句中,如果用as指定了一个目标,会将__enter__()方法的返回值赋予这个目标。
  • 运行中如果发生了异常,那么将会把异常的类型,值和追踪传递给__exit__()方法。如果__exit__()方法返回值为true,那么这个异常将会被抑制,否则这个异常将会被重新抛出。
  • 如果没有发生异常,也会调用__exit__()方法,但是传入的参数为None, None, None。通常也是在这里放入代码进行如文件流/会话的关闭等操作。
     
class Person:
    def __enter__(self):
        print("我是enter")

    def __exit__(self, exc_type, exc_val, exc_tb):
        print("我是exit ")
        print('exc_type', exc_type)  # exc_type None
        print('exc_val', exc_val)  # exc_val None
        print('exc_tb', exc_tb)  # exc_tb None

    def __call__(self, *args, **kwargs):
        print("我是call")
p = Person()
p()
with p as f: # 自动调用__enter__
    print("哈哈哈")
# 从with出去的时候. 自动调用__exit__


>>>
我是call
我是enter
哈哈哈
我是exit 
exc_type None
exc_val None
exc_tb None

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值