学习之上下文管理器

python 复制代码
one_file = open('demo.txt', 'w')
one_file.write("xxxxx")
# raise ValueError  # 如果抛出异常将会报错
one_file.close()
python 复制代码
with open('demo.txt', 'w') as f:  # open--返回的是IO--IO中实现了__enter__方法和__exit__方法
    f.write("aaaa")
python 复制代码
class MyContextManger:
    def __init__(self, filename, mode, encoding='utf-8'):
        self.filename, self.mode, self.encoding = filename, mode, encoding

    def __enter__(self):
        self.file_obj = open(self.filename, mode=self.mode, encoding=self.encoding)
        return self.file_obj

    def __exit__(self, exc_type, exc_val, exc_tb):  # 如果with语句出现异常的时候会接收
        # exc_type:异常的类型
        # exc_val:异常的值
        # exc_tb:异常的回溯
        # 如果返回None,则表示上下文管理器自己处理异常,即我们认为异常已经处理完毕了,Python解释器不会将异堂传递给上层代码。
        # 如果返回True,则表示上下文管理器已经成功处理了异常,并且异常已经被处理完毕了,Python解释器不会将弃常传递给上层代码。
        # 如果返回False或其他任意非空值,则表示上下文管理器没有成功处理异常,Python解释器会将异常传递给上层代码继续处理。
        self.file_obj.close()


if __name__ == '__main__':
    with MyContextManger("demo.txt", "w") as mm:  # MyContextManger()创建对象会直接调用__init__方法
        mm.write("sssss")

with上下文管理器就是实现了 enter,__exit__方法

相关推荐
2401_833033621 分钟前
html如何修改备注
jvm·数据库·python
水木流年追梦2 分钟前
【python因果库实战29】LaLonde 数据集2
开发语言·python·数据挖掘·langchain·机器人
我想我不够好。2 分钟前
2026.5.8 消防监控学习1hour
学习
2401_831419443 分钟前
C#怎么实现批量邮件发送 C#如何用MailKit批量发送个性化邮件和HTML格式邮件【网络】
jvm·数据库·python
Amazing_Cacao4 分钟前
CFCA精品可可产区认证课程风土体系(非洲):穿透浓厚表象,深度解剖精品可可底层的结构张力与多维对抗
笔记·学习·重构
2301_781571425 分钟前
golang如何实现微服务监控告警_golang微服务监控告警实现方法
jvm·数据库·python
zhaoyong2225 分钟前
Redis怎样简便地操作不同数据结构
jvm·数据库·python
m0_740796366 分钟前
MySQL中如何利用TAN或SIN计算三角函数_MySQL数学函数
jvm·数据库·python
weixin_444012937 分钟前
Layui上传组件upload怎么监听大文件上传的百分比进度条
jvm·数据库·python
2301_781571427 分钟前
CSS如何实现按钮颜色的流光特效_利用渐变背景定位属性
jvm·数据库·python