【python】with语句和上下文管理器
1.with语句
我们经常看到with open(xxxx,xxxx) as f这样的语句打开文件,但是却不用关闭,实际上它会自动调用了上下文管理器的上下文方法。当使用with语句时会调用上文方法__enter__(),with语句结束时会自动调用下文方法 __exit__() 进行关闭
使用语法:with 上下文管理器对象 as 上文函数执行的返回资源:
2.演示(打开文件)
我们一般用open()函数打开一个文件,现在我们定义一个类来演示上下文被调用
class File(object):
def __init__(self, file_name, mode):
self.file_name = file_name
self.mode = mode
# 调用上文
def __enter__(self):
print('执行上文')
self.file = open(self.file_name, self.mode)
return self.file # 返回的内容,即with语句后的as指向的内容
# 调用下文
def __exit__(self, exc_type, exc_val, exc_tb):
print('执行下文')
self.file.close()
if __name__ == '__main__':
with File('test.txt', 'r') as file:
data = file.read()
print(data)
***
结果:
执行上文
good morning(读取到的test.txt的内容)
执行下文
***
3.演示(数据库)
import pymysql
class SQL(object):
def __init__(self, host, user, password, database):
self.host = host
self.user = user
self.password = password
self.database = database
def __enter__(self):
print('执行上文')
self.__conn = pymysql.connect(host=self.host, port=3306, user=self.user, password=self.password,
database=self.database, charset='utf8')
self.__cs = self.__conn.cursor()
return self.__cs
def __exit__(self, exc_type, exc_val, exc_tb):
print('执行下文')
if exc_type:
self.__conn.rollback()
print(exc_val)
else:
self.__conn.commit()
self.__cs.close()
self.__conn.close()
return True
if __name__ == '__main__':
with SQL('localhost', 'root', 'mysql', 'jing_dong') as cs:
row_num = cs.execute('select * from goods')
if row_num > 0:
for i in cs.fetchall():
print(i)
还没有评论,来说两句吧...