关于Python with上下文管理协议以及自定义上下文管理

  • 上下文管理器

    • 上下文管理器是对Context Manager的翻译,上下文是context直译的叫法,在程序中用来表示代码执行过程中所处的前后环境
    • 在文件操作时,需要打开,关闭文件,而文件处于正在读写操作时,就是处在文件操作的上下文中,也就是文件操作环境中
  • 语法

    • with语法是Python提供的一种简化的语法,在python2.5开始引入的一种与异常处理相关的功能,适用于对资源进行访问的场合,确保不管适用过程中是否发生异常都会执行的必要的“扫尾”操作,以此释放资源
  • with上下文管理器示例

    • with open(“test.txt”, “a”)as f:
      f.write(‘上下文管理\n’)d
      • 运行上述代码,会在同级目录下创建一个叫test.txt的文本文件,并在文件中追加内容“上下文管理”并且换行
      • 在执行with语句时,首先执行with后面的open代码(如果已经有test.txt文件则打开,若无则创建),然后通过as将代码的结果保存到f中(相当于给test.txt起一个别名f,f只是一个变量名,可任意更改)
      • 在with下面是对test.txt执行的操作,如实例中的操作是写入内容
      • 在操作后,不需要对文件test.txt进行关闭操作f.close(),with上下文管理会在文件使用完后帮我们关闭test.txt文件
      • 这样既可以简化代码,又可以避免因粗心忘记关闭操作,因为在实际开发中,打开一个文件后,进行的操作可能异常复杂,这种情况是很可能忘记“扫尾”操作的
  • with上下文管理的原理

    • 在使用with上下文管理器时,并不是不需要关闭文件,而是文件的关闭操作在with的上下文管理器中已经实现了,当文件操作执行完成后,with语句会自动调用上下文管理器中的关闭语句来关闭文件资源
    • 我们的应用场景并不是一成不变的,with是怎么实现帮我们进行“扫尾”操作的呢?
      • with语句在执行时,调用上下文管理器的__enter__和__exit__两个方法,这两个方法就是上下文管理器中实现的方式
      • __enter__方法会在执行whit后面的语句时执行,一般用来处理操作前的内容,如我们打开文件,创建对象,初始化等等
      • _exit__方法会在with中的代码执行完毕后,一般用来做一些善后的工作,如文件的关闭,数据库的关闭
  • 如何来自定义上下文管理器?

    • 在上下文管理的原理上,上下文管理器的原理实现是__enter__和__exit__两个方法,索引我们可以根据此原理来自定义自己的上下文管理器,只需实现__enter__和__exit__两个方法即可自定义上下文管理器
      上述代码中,我们不是使用python实现的好的open来打开文件而是通过自定的OpenFile类来完成文件的操作
      代码运行过程中和结果与用open类似,会执行OpenFile后的代码(自定义类OpenFile中的代码),如果存在文件test01.txt,打开文件并在其中写入“自定义上下文管理”,如果不存在文件test01.txt,则创建文件并写入“自定义上下文管理”,说明我们成功实现了自定义上下文管理
  • 上下文管理中的自定义异常处理

    • 我们看到__exit__方法中有三个蚕食exc_type,exc_val和exc_tb,这三个参数是用来接收异常信息的,如果代码在运行时发生异常,异常信息会被保存到这三个参数中
      异常处理
      上述代码中,我们将w换成了r,会出现异常,因为以读的模式打开文件。不能进行写的操作
      运行的结果为此结果
      可以看到我们打印的三个参数exc_type,exc_val,exc_tb的值,分别存储了异常的以下信息:exc_type:异常类型,exc_val:异常值,exc_tb:异常回溯追踪
      当with中执行的语句发生异常时,异常信息会被发送到__exit__方法的参数中,这时可以根据情况选择如何处理异常
      因为在__exit__函数执行异常处理时,会根据函数的返回值决定是否将系统抛出的异常继续向外抛出,如果返回值为False就会向外抛出,用户就会看到,如果返回值为True不会向外抛出,而是现实我们自定义的信息
      我们可以根据这个原理自定义如何处理异常,只要将返回值设置为True就行了
      自定义处理异常
      通过设置返回值为True,上下文管理器就不会向外抛出异常,此时我们再根据exc_type(异常类型)的值是否为None来自定义输出的异常信息,就可以实现上下文管理中的自定义异常了
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值