Python中的with语句与上下文管理器笔记

上下文管理器与with语句
class A:
    def __enter__(self):
        a = 1
        
    def __exit__(self):
        b = 2
with A() as obj_A:
    pass

思考:此时的obj_A指向的是什么?

答:指像的是None, obj_A指向的不是上下文管理器,而是__enter__方法的返回值,此时没有返回值。因此obj_A指向的是None。如何让其指向不为None?

注:以下示例代码只能用于debug模式查看obj_A的指向状态,由于__exit__方法没有实现完成会报错。

class A:
    def __enter__(self):
        a = 1
        return a
    def __exit__(self):
        b = 2
with A() as obj_A:
    pass

关于__exit__方法的下一步说明:

  1. __exit__方法需要接收4个参数,在执行过程中如果发生了异常将不会继续执行而直接执行__exit__方法,而__exit__方法中的参数则代表对异常的描述。exc_type代表异常类型,exc_val代表异常值,tb代表traceback的缩写:返回错误地址。
class Context(object):
    def __enter__(self):
        print('-------- 连接到资源 ------- ')
        return self
        
    def func_A(self):
        print("——————正在执行方法A————————")
    def __exit__(self, exc_type, exc_val, exc_tb):
        print('———————— 释放资源 —————————')

with Context() as C:
    C.func_A()
  1. __exit__异常处理

    __exit__方法返回值只有两种(True or False)。

    外部没有抛出异常的情况:

class Context(object):
    def __enter__(self):
        print('-------- 连接到资源 ------- ')
        return self

    def func_A(self):
        print("——————正在执行方法A————————")
    def __exit__(self, exc_type, exc_val, exc_tb):
        print('———————— 释放资源 —————————')
        return True

with Context() as C:
    a = 1/0
    C.func_A()
    
# 执行结果:没有抛出异常
-------- 连接到资源 ------- 
———————— 释放资源 —————————

Process finished with exit code 0

外部抛出异常(__exit__方法无返回值时默认以False处理):

class Context(object):
    def __enter__(self):
        print('-------- 连接到资源 ------- ')
        return self

    def func_A(self):
        print("——————正在执行方法A————————")
    def __exit__(self, exc_type, exc_val, exc_tb):
        print('———————— 释放资源 —————————')
        return False
try:
    with Context() as C:
        a = 1/0
        C.func_A()
except Exception as Ex:
    print("出现错误:",Ex)
# 执行结果:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值