Python 上下文管理 魔术方法

本文介绍了Python中的上下文管理对象,包括注意事项、异常处理、上下文语句、方法参数及其应用。通过示例展示了如何使用和方法,以及在异常发生时如何确保上下文的安全。此外,还探讨了上下文管理在资源管理、权限验证等场景中的应用,并通过装饰器实现上下文管理的技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、上下文管理对象

当一个对象同时实现了__enter__()__exit__()方法,它就属于上下文管理的对象。

  • __enter__:进入与此对象相关的上下文。如果存在该方法,with语法会把该方法的返回值作为绑定到as子句中指定的变量上

  • __exit__:退出与此对象相关的上下文

  • 参数介绍

    __enter__方法,没有其它参数
    __exit__方法有3个参数:
    __exit__(self, exc_type, exc_val, exc_tb) 这三个参数都与异常有关
    	如果该上下文退出时没有异常,这三个参数都是None
    	如果有异常,参数意义如下
    		exc_type:异常类型
    		exc_val:异常的值
    		exc_tb:异常的追踪信息
    	__exit__方法返回一个等效True的值,则压制异常;否则,继续抛出异常
    

1.1 注意事项

  • 实例化对象的时候,并不会调用__enter__
  • 进入with语句块调用__enter__方法,然后执行语句体
  • 最后离开with语句块的时候,调用__exit__方法
  • with可以开启一个上下文运行环境,在执行前做一些准备工作,执行后做一些收尾工作
  • 注意,with并不开启一个新的作用域

1.2 示例

import time
class Point:
    def __init__(self):
        print('init ======')
        time.sleep(1)
        print('init over')
        
    def __enter__(self):
        print('enter ------')
        
    def __exit__(self, exc_type, exc_val, exc_tb):
        print('exit ++++++')
    
with Point() as p:
    print('in with ---------')
    time.sleep(2)
    print('with over')

print('======end======')
init ======
init over
enter ------
in with ---------
with over
exit ++++++
======end======

2、异常对上下文的影响

  • 通过此例可以看出在有异常抛出的时候(即使抛出 sys.exit()异常)
  • enterexit照样执行,上下文管理时安全的
  • with语法,会调用with后的对象的__enter__方法
  • with语法后如果有as,则将该方法的返回值赋给as子句的变量
import time
class Point:
    def __init__(self):
        print('init ======')
        time.sleep(1)
        print('init over')
        
    def __enter__(self):
        print('enter ------')
        
    def __exit__(self, exc_type, exc_val, exc_tb):
        print('exit ++++++')
    
with Point() as p:
    print('in with ---------')
    raise Exception('error')
    time.sleep(2)
    print('with over')

print('======end======')
init ======
init over
enter ------
in with ---------
exit ++++++
---------------------------------------------------------------------------
Exception                                 Traceback (most recent call last)
     16     print('in with ---------')
-
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值