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

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

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

这样看起来,是挺短呀。

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

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

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

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

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

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

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

打印出来是这样的:

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

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

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

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

可以返回一个对象:

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

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

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

举个例子:

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

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

执行结果是这样的:

可以看到,这些抛出的异常信息,我们可以在 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!

python with as 用法_你在 Python 中常常写的 with..as.. 到底是个啥?相关推荐

  1. python装饰器用法_深入浅出分析Python装饰器用法

    本文实例讲述了Python装饰器用法.分享给大家供大家参考,具体如下: 用类作为装饰器 示例一 最初代码: class bol(object): def __init__(self, func): s ...

  2. python or的用法_详细介绍Python中and和or实际用法

    and 和 or 的特殊性质 在Python 中,and 和 or 执行布尔逻辑演算,但是它们并不返回布尔值:而是,返回它们实际进行比较的值之一.下面来看一下实例.>>> 'a' a ...

  3. python dict函数用法_如何将python中的dict作为参数传入c函数中用c做相关的处理?...

    展开全部 #先上代码再解释 static PyObject *keywdarg_parrot(PyObject *self, PyObject *args, PyObject *keywds) { i ...

  4. python字符串切片用法_详解Python字符串切片

    在python中,我们定义好一个字符串,如下所示. 在python中定义个字符串然后把它赋值给一个变量. 我们可以通过下标访问单个的字符,跟所有的语言一样,下标从0开始(==,我自己都觉得写的好脑残了 ...

  5. python语言format用法_详解Python中的format格式化函数的使用方法

    format函数实现字符串格式化的功能 基本语法为: 通过 : 和 {} 来控制字符串的操作 一.对字符串进行操作 1. 不设置指定位置,按默认顺序插入 ①当参数个数等于{}个数的时候 str_1 = ...

  6. python get函数用法_详解python中get函数的用法(附代码)

    描述 Python 字典 get() 函数返回指定键的值,如果值不在字典中返回默认值. 语法 get()方法语法:dict.get(key, default=None) 参数 key – 字典中要查找 ...

  7. python语言arrows用法_如何在Python中使用pyarrow读取parquet文件

    我已经从数据库中创建了一个具有三列(id.author.title)的parquet文件,并希望使用条件(title='learnpython')读取拼花板文件. 下面提到的是我用于这个POC的pyt ...

  8. python raw input用法_如何在 python raw_input 中使用 tab 键补全?

    http://stackoverflow.com/ques... 这段代码写得不错,如果要补全第二个参数要自己写 complete 函数类似于下面的代码. def complete_cd(self, ...

  9. python的继承用法_【后端开发】python中继承有什么用法?python继承的用法详解

    本篇文章给大家带来的内容是关于python中继承有什么用法?python继承的用法详解,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 面向对象三大特征 1.封装:根据职责将属性和方法 ...

  10. python中的浮点数用法_如何利用Python在运算后得到浮点数值的方法详解

    在python中进行两个整数相除的时候,在默认情况下都是只能够得到整数的值,而在需要进行对除所得的结果进行精确地求值时,想在运算后即得到浮点值,那么如何进行处理呢? 1.修改被除数的值为带小数点的形式 ...

最新文章

  1. android 足球游戏,足球游戏哪个好玩,安卓单机足球游戏哪个好玩
  2. 同名的const 成员函数
  3. 分布式数据库中间件对比总结
  4. jsf入门实例_JSF错误消息示例教程
  5. java反射机制面试_java面试中面试官让你讲讲反射,应该从何讲起?
  6. conan入门(六):conanfile.txt conanfile.py的区别
  7. C++实现求解完美数算法
  8. 二维码的纠错码原理及如何纠错(1)
  9. GDB 调试错误解决
  10. 利润统计函数c语言,C语言计算内部回报率(或名内部收益率)(IRR)
  11. 远程实时调试手机上的web页面
  12. 留言送书文末 | 20年磨一剑!南京大学周志华教授团队重磅新作出版
  13. 「自动搬运+CDN」FFmpeg + x264 t_mod + x265 yuuki
  14. VirtualBox安装Extention Pack教程
  15. 微信小程序实现FBX模型的动画加载
  16. HTML5标签-按功能分类整理
  17. 红楼梦评论--王国维
  18. 分库分表:如何解决数据量大读写缓慢
  19. 油脂抵近历史高点,棕榈油认购大涨,CCS05继续向下2022.3.1
  20. HAL+Cube MX 学习之PWM

热门文章

  1. ajax的理解与工作流程
  2. python中字典的几个方法介绍
  3. bzoj 1012 最大数maxnumber
  4. [转载]用 FFMPEG 合并 MP4 视频
  5. (转)递归算法的时间复杂度终结篇与Master method
  6. cocos2d-html5 sprite打印宽高都为0的问题
  7. 近百个常用js代码汇总
  8. 每日一句20191105
  9. 181023词霸有道扇贝每日一句
  10. 10 Love Quotes Touch Your Soul at First Sight