前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >49 - 使用代码描述with语句的作用

49 - 使用代码描述with语句的作用

原创
作者头像
ruochen
修改2021-05-31 10:30:05
修改2021-05-31 10:30:05
4200
举报

1. with语句有什么作用,请用代码解释

  • with语句适用于对资源访问的场合,确保不管使用过程是否发生异常都会执行必要的 "清理"工作
代码语言:txt
复制
f = open('files/readme.txt', 'r')
data = f.read()
print(data)

'''
1. 没有关闭文件
2. 即使关闭了文件,但在关闭之前如果抛出异常,仍然会无法关闭文件
'''
代码语言:txt
复制
hello world
代码语言:txt
复制
I love you
代码语言:txt
复制
How are you?
代码语言:txt
复制
f = open('files/readme.txt', 'r')
try:
    data = f.read()
except:
    print('抛出异常')
finally:
    f.close()
代码语言:txt
复制
with open('files/readme.txt', 'r') as f:
    data = f.read()
    print(data)
代码语言:txt
复制
hello world
代码语言:txt
复制
I love you
代码语言:txt
复制
How are you?

2. 如何将with语句用于一个自定义类

代码语言:txt
复制
'''
__enter__

__exit__
'''

class MyClass:
    def __enter__(self):
        print('__enter__() is call!')
        return self
    def process1(self):
        print('process1')
        
    def process2(self):
        x = 1/0 
        print('process2')
    def __exit__(self, exc_type, exc_value, traceback):
        print('__exit__() is call!')
        print(f'type:{exc_type}')
        print(f'value:{exc_value}')
        print(f'trace:{traceback}')
        
with MyClass() as my:
    my.process1()
    my.process2()
代码语言:txt
复制
__enter__() is call!
代码语言:txt
复制
process1
代码语言:txt
复制
__exit__() is call!
代码语言:txt
复制
type:<class 'ZeroDivisionError'>
代码语言:txt
复制
value:division by zero
代码语言:txt
复制
trace:<traceback object at 0x0000029AA9F98DC8>
代码语言:txt
复制
---------------------------------------------------------------------------
代码语言:txt
复制
ZeroDivisionError                         Traceback (most recent call last)
代码语言:txt
复制
<ipython-input-10-b97c97f6e5f0> in <module>
代码语言:txt
复制
     23 with MyClass() as my:
代码语言:txt
复制
     24     my.process1()
代码语言:txt
复制
---> 25     my.process2()
代码语言:txt
复制
<ipython-input-10-b97c97f6e5f0> in process2(self)
代码语言:txt
复制
     13 
代码语言:txt
复制
     14     def process2(self):
代码语言:txt
复制
---> 15         x = 1/0
代码语言:txt
复制
     16         print('process2')
代码语言:txt
复制
     17     def __exit__(self, exc_type, exc_value, traceback):
代码语言:txt
复制
ZeroDivisionError: division by zero

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. with语句有什么作用,请用代码解释
  • 2. 如何将with语句用于一个自定义类
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档