python中with的用法

随笔3个月前发布 乔乔
29 0 0

目录

一、文件操作二、with原理

 


回到顶部

一、文件操作

#自行车

f=open("filename")
f.write()
f.close()

上述代码存在的问题:

(1)直接open()打开需要手动关闭,并且容易忘记关闭

(2)当文件操作出现异常导致程序提早离开,而没有执行关闭文件操作

#小轿车

try:
    f=open("xxx")
    f.write()    #文件操作
except:
    do something
finally:
    f.close()

虽然功能完善了,但是代码这么冗余,也太笨了吧

#特斯拉

with open("xxx") as f:
    f.write() #文件操作

一个with代码块直接解决一切,无论怎样的方式退出代码块都会自动关闭文件

问题来了,

with为什么可以做到自动关闭文件?
with为什么即便文件操作中出现异常也可以正常关闭文件?with语句和原始open同样返回一对象,有什么不一样?

回到顶部

二、with原理

__enter__()方法:紧跟with后面的语句被求值后,返回对象的__enter__()方法被调用,这个方法的返回值将被赋值给as后面的变量。

__exit__()方法:当with后面的代码块全部被执行完之后,将调用前面返回对象的__exit__()方法

 class Test(object):
      def __enter__(self):
          print("执行了 __enter__方法")
          return "enter返回的内容"
  
      def __exit__(self, type, value, trace):
          print("执行了 __exit__方法")
  
 with Test() as test:
     print("test:", test)

运行结果:

执行了 __enter__方法
test: enter返回的内容
执行了 __exit__方法

执行过程:

with后面的Test()语句执行、enter()执行
enter()返回值返回给as后面的变量test
执行with语句中间代码块打印变量test、
中间代码块执行完后执行__exit__()
推断:自动关闭文件是在__exit__()中调用文件关闭方法

 

© 版权声明

相关文章

暂无评论

您必须登录才能参与评论!
立即登录
暂无评论...