当前位置:
首页 > temp > python入门教程 >
-
Python教程:with语句的用法
一 、with语句的原理
上下文管理协议(Context Management Protocol):包含方法 __enter__()
和__exit__()
,支持该协议的对象要实现这两个方法。
上下文管理器(Context Manager):支持上下文管理协议的对象,这种对象实现了__enter__()
和__exit__()
方法。上下文管理器定义执行with语句时要建立的运行时上下文,负责执行with语句块上下文中的进入与退出操作。通常使用with语句调用上下文管理器,也可以通过直接调用其方法来使用。
说完上面两个概念,我们再从with语句的常用表达式入手,一段基本的with表达式,其结构是这样的:
with EXPR as VAR:
BLOCK
其中EXPR可以是任意表达式;as VAR是可选的。其一般的执行过程是这样的:
- 执行EXPR,生成上下文管理器context_manager;
-
获取上下文管理器的
__exit()__
方法,并保存起来用于之后的调用; -
调用上下文管理器的
__enter__()
方法;如果使用了as子句,则将__enter__()
方法的返回值赋值给as子句中的VAR; - 执行BLOCK中的表达式;
-
不管是否执行过程中是否发生了异常,执行上下文管理器的
__exit__(
)方法,__exit__()
方法负责执行“清理”工作,如释放资源等。如果执行过程中没有出现异常,或者语句体中执行了语句break/continue/return,则以None作为参数调用__exit__(None, None, None)
;如果执行过程中出现异常,则使用sys.exc_info得到的异常信息为参数调用__exit__(exc_type, exc_value, exc_traceback)
; -
出现异常时,如果
__exit__(type, value, traceback)
返回False,则会重新抛出异常,让with之外的语句逻辑来处理异常,这也是通用做法;如果返回True,则忽略异常,不再对异常进行处理。
二、自定义上下文管理器
Python的with语句是提供一个有效的机制,让代码更简练,同时在异常产生时,清理工作更简单。
class DBManager(object):
def __init__(self):
pass
def __enter__(self):
print('__enter__')
return self
def __exit__(self, exc_type, exc_val, exc_tb):
print('__exit__')
return True
def getInstance():
return DBManager()
with getInstance() as dbManagerIns:
print('with demo')
with后面必须跟一个上下文管理器,如果使用了as,则是把上下文管理器的 __enter__()
方法的返回值赋值给 target,target 可以是单个变量,或者由“()”括起来的元组(不能是仅仅由“,”分隔的变量列表,必须加“()”)
代码运行结果如下:
'''
__enter__
with demo
__exit__
'''
结果分析:当我们使用with的时候,__enter__
方法被调用,并且将返回值赋值给as后面的变量,并且在退出with的时候自动执行__exit__
方法
'''
学习中遇到问题没人解答?小编创建了一个Python学习交流群:711312441
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
class With_work(object):
def __enter__(self):
"""进入with语句的时候被调用"""
print('enter called')
return "xxt"
def __exit__(self, exc_type, exc_val, exc_tb):
"""离开with的时候被with调用"""
print('exit called')
with With_work() as f:
print(f)
print('hello with')
'''
enter called
xxt
hello with
exit called
'''
三、总结
自定义上下文管理器来对软件系统中的资源进行管理,比如数据库连接、共享资源的访问控制等。
出处:https://www.cnblogs.com/python1111/p/16541808.html
最新更新
nodejs爬虫
Python正则表达式完全指南
爬取豆瓣Top250图书数据
shp 地图文件批量添加字段
爬虫小试牛刀(爬取学校通知公告)
【python基础】函数-初识函数
【python基础】函数-返回值
HTTP请求:requests模块基础使用必知必会
Python初学者友好丨详解参数传递类型
如何有效管理爬虫流量?
2个场景实例讲解GaussDB(DWS)基表统计信息估
常用的 SQL Server 关键字及其含义
动手分析SQL Server中的事务中使用的锁
openGauss内核分析:SQL by pass & 经典执行
一招教你如何高效批量导入与更新数据
天天写SQL,这些神奇的特性你知道吗?
openGauss内核分析:执行计划生成
[IM002]Navicat ODBC驱动器管理器 未发现数据
初入Sql Server 之 存储过程的简单使用
SQL Server -- 解决存储过程传入参数作为s
关于JS定时器的整理
JS中使用Promise.all控制所有的异步请求都完
js中字符串的方法
import-local执行流程与node模块路径解析流程
检测数据类型的四种方法
js中数组的方法,32种方法
前端操作方法
数据类型
window.localStorage.setItem 和 localStorage.setIte
如何完美解决前端数字计算精度丢失与数