with上下文管理器
问题思考:with打开文件为何会自动关闭?
上下文管理器的概念:上下文管理器是一个python对象,为操作提供了额外的上下文信息,这种额外的信息,在使用with语句初始化上下文,以及完成with块中的所有代码时,采用可调用的形式。
- object.__enter__(self)
输入与此对象相关的运行时上下文,如果存在的话,with语句将绑定该方法的返回值到该语句的as子句中指定的目标。
- object.__exit__(self,exc_type,exc_val,exc_tb)
exc_type: #异常类型
exc_val: #异常值
exc_tb: #异常回溯追踪
退出与此对象相关的运行时上下文,参数描述导致上下文退西湖的异常,如果该上下文退出时没有异常,三个参数都将为None,如果提供一个异常,并且该方法希望抑制该异常(即防止它被传播),它应该返回一个真值,否则,在退出此方法时,异常将被正常处理。
class MyOpen(): def __init__(self,file_name,open_method,encoding="utf-8"): self.file_name=file_name self.open_method=open_method self.encoding=encoding def __enter__(self): self.f=open(self.file_name,self.open_method,encoding=self.encoding) return self.f def __exit__(self, exc_type, exc_val, exc_tb): print(exc_type) print(exc_val) print(exc_tb) self.f.close() with MyOpen("requirements.txt","r") as f: print(f) with MyOpen("requirements.txt", "r") as f: print(f+1)
运行结果:
<_io.TextIOWrapper name='requirements.txt' mode='r' encoding='utf-8'> None None None <class 'TypeError'> unsupported operand type(s) for +: '_io.TextIOWrapper' and 'int' <traceback object at 0x104d368c8>
上下文管理器连接mysql数据库
import pymysql #操作数据库的上下文管理器 class DB(object): def __init__(self,data_conf): self.con=pymysql.connect(**data_conf) self.cursor=self.con.cursor() def __enter__(self): return self.cursor def __exit__(self, exc_type, exc_val, exc_tb): self.cursor.close() self.con.close() DATABASES_CONF=dict( host='localhost', user='root', password='mysql', database='test', port=3306, charset='uft-8' ) with DB(DATABASES_CONF) as cur: cur.execute("SELECT * from students") print(cur.fetchone())
posted on 2020-08-26 10:40 crystal1126 阅读(112) 评论(0) 编辑 收藏 举报