python进阶:上下文管理器和with语句

2023-12-14 15:39:53

一、何为上下文管理器?

  • 在任何一门语言中,文件的输入输出、数据库的连接断开等,都是很常见的资源管理操作,但是资源是有限的,在写程序时,必须保证资源在使用过后得到释放,不然容易造成资源泄露,轻者使系统处理缓慢,重则会使系统崩溃
    比如说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
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。