python进阶:上下文管理器和with语句
2023-12-14 15:39:53
contextmanager
一、何为上下文管理器?
- 在任何一门语言中,文件的输入输出、数据库的连接断开等,都是很常见的资源管理操作,但是资源是有限的,在写程序时,必须保证资源在使用过后得到释放,不然容易造成资源泄露,轻者使系统处理缓慢,重则会使系统崩溃
比如说python中的打开文件操作
for x in range(10000000):
f = open('test.txt','w')
f.write('test file')
报错:
- 在python中,针对资源泄露的方式便是上下文管理器(context manager)。上下文管理器,能够帮助自动分配并且释放资源,其中最典型的便是with语句,上述代码可改成
for x in range(10000000):
with open('test.txt','w'):
f.write('test file')
也可以用try except finally语句处理
f = open('test.txt','w')
try:
f.write('hello')
finally:
f.close()
- finally语句是无论是否有异常都会执行的,相当于无论如何文件最终都会被关闭,不过相对于with语句,finally语句比较冗余且容易漏写,所以一般更倾向于with语句
二、上下文管理器的实现
(一)、基于类的上下文管理器
1、打开、关闭文件操作
class FileManager:
def __inin__(self,name,mode):
self.name = name
self.mode = mode
self.file = None
def __enter__(self):
self.file = open(self.name,self.mode)
return self.file
def __exit__(self,exc_type,exc_val,exc_tb):
if self.file:
self.file.close()
- 有了上述类之后就可以调用
with FileManager('test.txt','w') as f:
f.write('hello world')
就和我们使用with open() as f一样
需要注意的是,当使用类来创建上下文管理器时,必须保证类包括’__ enter__’ 和 ’__ exit__'方法
- __ enter__返回需要被管理的资源,也就是调用with后返回的对象
- __ exit__通常会存在一些释放、清理资源的操作
2、打开、关闭数据库操作
class MysqlDbManager:
def __init__(self,host,port,user,password,database):
self.host = host
self.port = port
self.user = user
self.password = password
self.database = database
def __enter__(self):
self.conn = pymysql.connnect(
host = self.host,
port = self.port,
user = self.user,
password = self.password,
database = self.database
)
return self.conn
def __exit__(self, exc_type, exc_val, exc_tb):
self.conn.close()
文章来源:https://blog.csdn.net/nzbing/article/details/134991244
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!