在Python中,上下文管理器是用魔术方法构建的类的一种,使用 with 关键字启动。这里,必须明确的是,with 仅仅是启动上下文的关键字,并以 as 关键字为启动的实例对象起别名,方便后续操作。
P1、定义支持上下文管理器的类
为了支持上下文管理,类定义时必须使用 __enter__() 、 __exit__() 两个魔术方法,它们分别负责上下文的进入和退出。通常,对文件、数据库、网络连接等操作都支持上下文管理。支持上下文管理器的类,结构如下:
可以看到支持上下文管理器的类和普通类是一样定义的,仅仅是多了两个方法。
P2、with是启动上下文管理器的钥匙
有了支持上下文管理的类之后,我们需要用 with 关键字启动类,并用 as 将例化对象值赋给实关键字。 with 语句结构如下:
with 关键字启动了类实例化对象过程,并将对象赋值给 as 后的标识符。P3、案例展示
如下,定义了一个支持上下文管理器的类:
class Count(): def __init__(self,n): self.count = n def __enter__(self): print(f'Enter:{self.count}') return self.count def __exit__(self,exc_type, exc_value,traceback): self.count = 0 print(f'Exit:{self.count}') return None
上述定义了一个Count类。该类在初始化时,会给类属性count赋一个初始值。而如果通过with启动后,会直接通过入口print()打印当前的count值。执行完成后,将count重置为0,并print()打印。
现在,使用该上下文管理器类,且执行无异常。如下:
with Count(10) as c: print(c-2)# 输出Enter:108Exit:0
再次使用该上下文管理器类,且执行有异常。如下:
with Count(10) as c: print(c-2) print(1/0)# 输出Enter:108Exit:0Traceback (most recent call last): Cell In[256], line 4 print(1/0)ZeroDivisionError:division by zero
对比上述两端代码执行结果,可以看到支持上下文管理器的类在出错时,可以完整执行退出语句,从而保证该实例对象的正常退出,解决了异常退出时垃圾数据问题。
-------------------------它是数字世界里的一把杀猪刀
却总能巧夺天工
它的世界是纯粹0、1组合
却总能创造无尽幻想
......
本公众号关注数据价值分析、编程学习,将不定期更新社会热点数据分析结果、编程技巧,分享数据分析工具、方法、学习等内容,欢迎有兴趣的小伙伴加入。