你在 Python 中常常写的 with..as.. 到底是个啥?

你在 Python 中常常写的 with..as.. 到底是个啥?

小帅b 学习python的正确姿势

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

举一个简单的例子,在 Java 中,你想要读取一个文件中的内容,一般来说需要自己定义一个这样的读取方法:

你在 Python 中常常写的 with..as.. 到底是个啥?

而在 Python 中,想要读取文件就可以直接这样:

你在 Python 中常常写的 with..as.. 到底是个啥?

这样看起来,是挺短呀。

你在 Python 中常常写的 with..as.. 到底是个啥?

其实文件操作中所涉及到的 try...except..finally 都给封装起来了:

你在 Python 中常常写的 with..as.. 到底是个啥?

而我们通过 with 拿了对象就可以直接操作了,是不是有点强大,那么它是怎么做到的呢?

接下来就是:学习 python 的正确姿势

你在 Python 中常常写的 with..as.. 到底是个啥?

with 语句是用于上下文对象的管理,通过它你就可以操作上下文对象:

你在 Python 中常常写的 with..as.. 到底是个啥?

比如上面这个,在 with 调用后得到的 Handsomeb对象里面,需要用到 enter () 和 exit() 这两个方法,也就是说,如果你想要让你创建的对象能被 with 使用,那么你这个对象必须要有 enter () 和 exit() 这两个方法。

这两个方法是干什么用的呢?

当我们使用 with 去执行这个对象的时候,就会先去调用 enter () ,最后再调用 exit() :

你在 Python 中常常写的 with..as.. 到底是个啥?

打印出来是这样的:

你在 Python 中常常写的 with..as.. 到底是个啥?

可以看到,我们使用 with 去调用 get_Handsomeb ,得到的这个对象会先执行“进入 enter 方法”,接着再执行 with 里面的 “get...”,等都执行完毕之后,再去执行 “进入 exit 方法” 。

我们再来看看 with..后面紧跟着的 as 是干嘛的呢?

你在 Python 中常常写的 with..as.. 到底是个啥?

在这里的 as 后面的变量名称,其实得到的就是 enter 方法返回的值。

你在 Python 中常常写的 with..as.. 到底是个啥?

你看,我在 enter 方法中定义返回了 “handsomeb” ,然后使用 “with .. as h” 的方式获取对象, 从打印结果可以看到:这时候 h 得到的就是 enter 方法中的返回值 “handsomeb” 。

可以返回一个对象:

你在 Python 中常常写的 with..as.. 到底是个啥?

接着,我们再来看看我们定义的这个 exit 方法,细心点你会发现,这里携带了这么几个参数:type, value, trace。

它们是干嘛的呢?这就是我们开头所说的问题。

我们在操作一些对象的时候,比如操作文件的时候,可能会发现这样那样未知的异常,比如文件的位置找不到了,文件打不开了等等问题,关于这些异常的信息,我们可以在 exit 方法中得到。

举个例子:

我们将type, value, trace这几个参数都打印出来,然后创建一个计算的方法:

你在 Python 中常常写的 with..as.. 到底是个啥?

不过这个方法执行的是 100/0 ,我们知道 0 是不能作为除数的,这样是会报错的,我们使用 with 来调用下看看:

你在 Python 中常常写的 with..as.. 到底是个啥?

执行结果是这样的:

你在 Python 中常常写的 with..as.. 到底是个啥?

可以看到,这些抛出的异常信息,我们可以在 exit 方法中的参数中直接获取,那么就可以在这里做一些事情(对一些异常进行处理)了,比如说,在文件操作中,我们到最后都需要关闭这个文件流的,但是有了 exit 这个方法, Python 直接在里面做了资源关闭操作,我们就不需要再手动去关闭了。

ok,以上就是今天我给你分享的 with 工作方式,总结一下就是:

1.通过 with 语句可以得到一个上下文管理器
2.执行对象
3.加载 enter 方法
4.加载 exit 方法
5.执行 enter
6.as 可以得到 enter 的返回值
7.拿到对象执行相关操作
8.执行完了之后调用 exit 方法
9.如果遇到异常,exit 可以获取到异常信息
10.在 exit 中处理异常,返回 True
11.继续执行 with 后面的语句。

希望对你有帮助,我们下回见,peace!

猜你喜欢

转载自blog.51cto.com/15082392/2644477