上下文管理器协议 __enter__ __exit__方法

with:上下文管理器协议:
__enter__:进入上下文(with操作对象时)
__exit__:退出上下文(with中的代码块执行完毕之后)
with是用来启动对象的上下文协议的,不是用来专门操作文件的

使用with语句的时候不需要显式的去关闭文件资源,因为它自动会关闭,
那么这个自动关闭是怎么实现的呢,这其实就是__enter__和__exit
__魔法方法在起作用.
with as 语句中as 后面的变量就是__enter__魔法函数返回值

with open("text.txt", mode="r", encoding="utf-8")as a:  # __enter__:进入上下文(with操作对象时)
      那么此时a 就是enter方法的返回值,进入上下文的
     print(a.read())  # 执行对象当中的内容

print(a.read())
此时在我with执行完成 之后会调用__exit__方法,结束会话,此时在外部调用时,提示异常
ValueError: I/O operation on closed file. #文件没有打开

  

自定义一个实现读取文件关闭的方法


class OpenFile:


    def __init__(self,filepath,mode,encoding="utf-8"):
        self.file =  open(file=filepath,mode=mode,encoding=encoding)

    def __enter__(self):
        print("-------------进入上下文会话------------")
        return self.file.read()

    def __exit__(self, exc_type, exc_val, exc_tb):
        self.file.close()
        print("-------------结束上下文会话------------")


# a = OpenFile("text.txt", mode="r", encoding="utf-8")
# with a as s:
#     print(s)

"""
输出结果:
-------------进入上下文会话------------
dddd
pppp
-------------结束上下文会话------------

"""

  

 

原文地址:http://www.cnblogs.com/manxingsir/p/16852193.html

1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长! 2. 分享目的仅供大家学习和交流,请务用于商业用途! 3. 如果你也有好源码或者教程,可以到用户中心发布,分享有积分奖励和额外收入! 4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解! 5. 如有链接无法下载、失效或广告,请联系管理员处理! 6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需! 7. 如遇到加密压缩包,默认解压密码为"gltf",如遇到无法解压的请联系管理员! 8. 因为资源和程序源码均为可复制品,所以不支持任何理由的退款兑现,请斟酌后支付下载 声明:如果标题没有注明"已测试"或者"测试可用"等字样的资源源码均未经过站长测试.特别注意没有标注的源码不保证任何可用性