Python快速入门 | python中频繁使用到的语句:牛逼的 with 语句

接着上篇,我们继续来说说 Python 中常常会用到的语句。

with

with 语句可以说是 Python 中 “人生苦短,我用 Python” 的代表之一,它可以使得我们在编写代码的时候非常简短,且行之有效。

举一个简单的例子,

本文隐藏内容 登陆 后才可以浏览
ok,以上就是我要跟你说的,with 语句的工作方式,简单点说,enter 方法做一些初始化操作,exit 做一些擦屁股的操作。总结一下就是:

1.通过 with 语句可以得到一个上下文管理器

2.执行对象

3.加载 __enter__ 方法

4.加载 __exit__ 方法

5.执行 __enter__,

6.as 可以得到 enter 的返回值

7.拿到对象执行相关操作

8.执行完了之后调用 __exit__ 方法

9.如果遇到异常,__exit__ 可以获取到异常信息

10.在 __exit__ 中处理异常,返回 True

11.继续执行 with 后面的语句。

那么现在的你,能否写一个 with 语句的例子,加深下自己对它的认识了呢?

24 Replies to “Python快速入门 | python中频繁使用到的语句:牛逼的 with 语句”

  1. Rose说道:

    帅b,你看看我理解的对不对?
    当你想让你的类支持 with 语句时就是要定义好enter和exit方法(你可能问为什么呢?不定义enter和exit即不符合上下文管理协议,不符合上下文管理协议即代表你定义的类不支持with语句的使用),enter() 方法通常是用来初始化资源,比如打开一个文件或者网络连接,然后返回这个初始化后的资源。exit() 方法则是在离开 with 语句块时被调用,负责执行清理工作,如关闭文件或网络连接,并处理 with 语句块中发生的任何异常。as 关键字用于 “接收” 来自 enter() 方法的返回值,并将其赋给一个变量,这个变量在 with 语句块内部是可见并可用的。
    而__exit__() 方法的定义要求必须有四个参数:self, exc_type, exc_value, 和 traceback。这些参数有特定的作用,尤其是在处理 with 语句块中的异常时。
    self: 这是类实例本身,就像其他实例方法中的 self 一样,它指向当前对象的实例。
    exc_type: 这个参数接收异常的类型。如果 with 块中发生了异常,exc_type 会被设置为异常类型;如果没有异常,它会被设置为 None。
    exc_value: 这个参数接收异常的值,也就是Exception的实例本身。如果 with 块中有异常发生,那exc_value 将是异常对象的具体实例;如果没有异常,它会是 None。
    traceback: 这个参数接收一个 traceback 对象,它包含异常发生点的详细信息(比如调用堆栈)。如果 with 块中没有异常,traceback 同样会是 None。

    1. 小帅b说道:

      你理解得非常准确!总结得也很清楚。

  2. kelvinweng说道:

    是有点吃力,最近也在看小帅b推荐的深入浅出python量化交易,里面函数和类的方法引用的参数,包括写法,真的比较难理解,很抽象。比如这篇里面的“self”,为什么一定要有呢?定义的方法cal(),实际上是不需要参数的,为何python就规定要写上self呢?还有return self,return True也是。希望后面能搞清楚。

  3. 305012398说道:

    为什么不直接with Handsomeb() as h,而要单独又写个get_Handsomeb()函数绕一下

  4. rush_B说道:

    self ,type, value, trace
    对象,类型,值,trace 是什么? 不知道说的对不对

  5. Hans·Rain说道:

    如果在__enter__中返回的对象是self,是不是可以理解为h.cal()中的这个h算是实例化对象?

      1. tao说道:

        对“面向对象”的编程思想总是很懵逼啊,“函数”也用得不顺手,期待慢慢能提高

  6. 小帅b说道:

    如果这一篇你看得有点吃力,没关系,就先知道了 with 的写法好了,往后我跟你说明白对象和方法后,你再来看这篇会很容易理解。

  7. slient说道:

    请问帅b,后面会不会讲到魔术方法,装饰器,元类这些,最近自动化的课程学完了,基础的架子会搭建了,但是用到项目里面发现总还有可以优化的地方,但是这些涉及到的知识属于测试开发的课程了,暂时不想报班了。。。

发表回复