python中with用法讲解


Posted in Python onFebruary 07, 2020

我们都知道打开文件有两种方法:

  • f = open()
  • with open() as f:

这两种方法的区别就是第一种方法需要我们自己关闭文件;f.close(),而第二种方法不需要我们自己关闭文件,无论是否出现异常,with都会自动帮助我们关闭文件,这是为什么呢?

我们先自定义一个类,用with来打开它:

class Foo():
  def __enter__(self):
    print("enter called")
  def __exit__(self, exc_type, exc_val, exc_tb):
    print("exit called")
    print("exc_type :%s"%exc_type)
    print("exc_val :%s"%exc_val)
    print("exc_tb :%s"%exc_tb)


with Foo() as foo:
  print("hello python")
  a = 1/0
  print("hello end")

执行结果:

enter called
Traceback (most recent call last):
hello python
exit called
exc_type :<class 'ZeroDivisionError'>
exc_val :division by zero
 File "F:/workspaces/python_workspaces/flask_study/with.py", line 25, in <module>
  a = 1/0
exc_tb :<traceback object at 0x0000023C4EDBB9C8>
ZeroDivisionError: division by zero

Process finished with exit code 1

我们看到,执行结果的输入顺序,分析如下:

当我们with Foo() as foo:时,此时会执行__enter__方法,然后进入执行体,也就是:

print("hello python")
a = 1/0
print("hello end")

语句,但是在a=1/0出现了异常,with将会中止,此时就执行__exit__方法,就算不出现异常,当执行体被执行完毕之后,__exit__方法仍然被执行一次。

我们回到with open("file")as f: 不用关闭文件的原因就是在__exit__方法中,存在关闭文件的操作,所以不用我们手工关闭文件,with已将为我们做好了这个操作,这就可以理解了。

以上就是小编整理的相关内容,如果大家有任何补充可以联系三水点靠木小编。

Python 相关文章推荐
Django静态资源URL STATIC_ROOT的配置方法
Nov 08 Python
Python中使用MELIAE分析程序内存占用实例
Feb 18 Python
python模拟Django框架实例
May 17 Python
python使用super()出现错误解决办法
Aug 14 Python
python实现树形打印目录结构
Mar 29 Python
python之DataFrame实现excel合并单元格
Feb 22 Python
python在回调函数中获取返回值的方法
Feb 22 Python
pyinstaller打包多个py文件和去除cmd黑框的方法
Jun 21 Python
Django发送邮件和itsdangerous模块的配合使用解析
Aug 10 Python
Python参数传递及收集机制原理解析
Jun 05 Python
Python 如何反方向迭代一个序列
Jul 28 Python
怎么解决pycharm license Acti的方法
Oct 28 Python
如何基于Python实现数字类型转换
Feb 07 #Python
Python while循环使用else语句代码实例
Feb 07 #Python
Python matplotlib画曲线例题解析
Feb 07 #Python
python next()和iter()函数原理解析
Feb 07 #Python
使用tensorflow实现矩阵分解方式
Feb 07 #Python
python匿名函数lambda原理及实例解析
Feb 07 #Python
Python用input输入列表的实例代码
Feb 07 #Python
You might like
利用 window_onload 实现select默认选择
2006/10/09 PHP
从C/C++迁移到PHP——判断字符类型的函数
2006/10/09 PHP
PHP 字符串操作入门教程
2006/12/06 PHP
解析php session_set_save_handler 函数的用法(mysql)
2013/06/29 PHP
PHP数字字符串左侧补0、字符串填充和自动补齐的几种方法
2014/05/10 PHP
PHP通过插入mysql数据来实现多机互锁实例
2014/11/05 PHP
PHP整合七牛实现上传文件
2015/07/03 PHP
thinkPHP+LayUI 流加载实现功能
2019/09/27 PHP
laravel实现登录时监听事件,添加登录用户的记录方法
2019/09/30 PHP
ExtJS GTGrid 简单用户管理
2009/07/01 Javascript
Jquery公告滚动+AJAX后台得到数据
2011/04/14 Javascript
jQuery多条件筛选如何实现
2015/11/04 Javascript
JS实现网页上随机产生超链接地址的方法
2015/11/09 Javascript
Bootstrap编写一个同时适用于PC、平板、手机的登陆页面
2016/06/30 Javascript
Bootstrap学习笔记之环境配置(1)
2016/12/07 Javascript
关于Bootstrap按钮组件消除黄框的方法
2017/05/19 Javascript
JS中正则表达式要注意lastIndex属性
2017/08/08 Javascript
解决JQuery的ajax函数执行失败alert函数弹框一闪而过问题
2019/04/10 jQuery
详解JavaScript中的强制类型转换
2019/04/15 Javascript
WebGL three.js学习笔记之阴影与实现物体的动画效果
2019/04/25 Javascript
vue中引入mxGraph的步骤详解
2019/05/17 Javascript
解决layui弹出层layer的area过大被遮挡的问题
2019/09/21 Javascript
微信小程序 轮播图实现原理及优化详解
2019/09/29 Javascript
javascript实现文字跑马灯效果
2020/06/18 Javascript
微信小程序抽奖组件的使用步骤
2021/01/11 Javascript
利用Python中的pandas库对cdn日志进行分析详解
2017/03/07 Python
python中子类调用父类函数的方法示例
2017/08/18 Python
python3中获取文件当前绝对路径的两种方法
2018/04/26 Python
Python单元测试unittest的具体使用示例
2018/12/17 Python
pygame实现成语填空游戏
2019/10/29 Python
TensorFlow实现checkpoint文件转换为pb文件
2020/02/10 Python
Python如何给函数库增加日志功能
2020/08/04 Python
结婚邀请函范文
2014/01/14 职场文书
风险评估实施方案
2014/03/09 职场文书
购房委托书
2014/10/15 职场文书
我的中国梦主题教育活动总结
2015/05/07 职场文书