【python】上下文协议

本文介绍了Python中的上下文管理协议,包括其应用场景如文件操作、线程加锁等,并通过实例详细解释了如何利用with语句简化资源管理,以及__enter__和__exit__方法的实现原理。

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

常见的上下文协议出现的地方有:
1.文件操作的打开与关闭

    with open('a.txt') as f:
    	print(f.read())

等同于

f=open("人口")
print(f.read())
f.close()

2.线程or进程加锁
以线程加锁为例

import threading
l=threading.Lock()  #创建线程互斥锁
 with l:  #上下文协议,不必自己上锁和解锁                 # l.acquire()
        print("Heelo", k)                              # print("Heelo",k)
                                                       # l.release()

以上可以看出上下文协议带给我们的便利:
1.使用with语句结束后,会自动完成清理
2.在需要管理一些资源,比如文件,网络连接,锁的编程环境中,可以在__ exit __ 中定制自动释放资源的机制.

下面来探讨一下他的实现原理():

class Open:
    def __init__(self,name):
        self.name=name
        print("init方法执行了")

    def __enter__(self):
        print('出现with语句,对象的__enter__被触发,有返回值则赋值给as声明的变量')
        return self

    def __exit__(self, exc_type, exc_val, exc_tb):
        print('with中代码块执行完毕时执行我')
        
with Open('a.txt') as f: #先执行了init方法,然后执行enter方法,return的值给f,和f=Open('a.txt')实例化不一样的
    #等同于f=Open("a.txt")._enter__()
    print(f)
    print(f.name)
    print('=====>执行代码块')
"""
__exit__()中的三个参数分别代表异常类型,异常值和追溯信息,with语句中代码块出现异常,则with后的代码都无法执行
如果__exit()返回值为True,那么异常会被清空,就好像啥都没发生一样,with后的语句正常执行
"""
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值