python中with用法讲解

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

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

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

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

?

|----------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 | 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"``) |

执行结果:

?

|----------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 1 2 3 4 5 6 7 8 9 10 11 12 | 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__方法,然后进入执行体,也就是:

?

|-------|----------------------------------------------------------------------------|
| 1 2 3 | print``(``"hello python"``) a ``= 1``/``0 print``(``"hello end"``) |

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

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

相关推荐
m0_746752301 小时前
c++怎么利用std--variant处理多种二进制子协议包的自动分支解析【进阶】
jvm·数据库·python
m0_734949798 小时前
MySQL如何配置定时清理过期备份文件_find命令与保留周期策略
jvm·数据库·python
t***5448 小时前
Clang 编译器在 Orwell Dev-C++ 中的局限性
开发语言·c++
m0_514520578 小时前
MySQL索引优化后性能没提升_通过EXPLAIN查看索引命中率
jvm·数据库·python
H Journey9 小时前
Python 国内pip install 安装缓慢
python·pip·install 加速
oy_mail9 小时前
QoS质量配置
开发语言·智能路由器·php
oyzz1209 小时前
PHP操作redis
开发语言·redis·php
nashane9 小时前
HarmonyOS 6学习:网络能力变化监听与智能提示——告别流量偷跑,打造贴心网络感知应用
开发语言·php·harmony app
Polar__Star10 小时前
如何在 AWS Lambda 中正确使用临时凭证生成 S3 预签名 URL
jvm·数据库·python
凌波粒10 小时前
Java 8 “新”特性详解:Lambda、函数式接口、Stream、Optional 与方法引用
java·开发语言·idea