Python Study(02)之 Context Manager
来源:互联网 发布:最近比较火的网络歌曲 编辑:程序博客网 时间:2024/05/16 02:03
上下文管理器(context manager)是Python2.5开始支持的一种语法,用于规定某个对象的使用范围。一旦对象进入或者离开该使用范围,会有特殊操作被调用 (比如为对象分配或者释放内存)。它的语法形式是with…as…
关闭文件
我们会进行这样的操作:打开文件,读写,关闭文件。程序员经常会忘记关闭文件。上下文管理器可以在不需要文件的时候,自动关闭文件。
f = open("new.txt", "w")print(f.closed) # whether the file is openf.write("Hello World!")f.close() #如果此处不关闭,那么该文件一直被锁定print(f.closed)
使用Context Manger
with open("new.txt", "w") as f: print(f.closed) f.write("Hello World!") # 当离开此处时候,必然就自动关闭。print(f.closed)
两段程序实际上执行的是相同的操作。我们的第二段程序就使用了上下文管理器 (with…as…)。上下文管理器有隶属于它的程序块。当隶属的程序块执行结束的时候(也就是不再缩进),上下文管理器自动关闭了文件 (我们通过f.closed来查询文件是否关闭)。我们相当于使用缩进规定了文件对象f的使用范围。
上下文管理器本质
我们使用上下文管理器的语法时,我们实际上是通过with Object as obj。即要求Python在进入with…as…程序块之前调用对象obj的__enter__()方法,在结束程序块的时候调用obj的__exit__()方法。
对于文件对象f来说,文件对象f是内置对象,所以f自动带有这两个特殊方法,不需要自定义。它定义了__enter__()和__exit__()方法(可以通过dir(f)看到)。在f的__exit__()方法中,有self.close()语句。所以在使用上下文管理器时,我们就不用明文关闭f文件了。
自定义上下文管理器
任何定义了_enter_()和_exit_()方法的对象都可以用于上下文管理器。 当然文件对象f是内置对象,所以f自动带有这两个特殊方法,不需要自定义。
class VOW(object): def __init__(self, text): self.text = text def __enter__(self): self.text = "I say: " + self.text # add prefix return self # note: return an object def __exit__(self,exc_type,exc_value,traceback): self.text = self.text + "!" # add suffixwith VOW("I'm fine") as myvow: print(myvow.text)print(myvow.text)
在进入上下文和离开上下文时,对象的text属性发生了改变(最初的text属性是”I’m fine”)。
enter()返回一个对象。上下文管理器会使用这一对象作为as所指的变量,也就是myvow。在enter()中,我们为myvow.text增加了前缀 (“I say: “)。在exit()中,我们为myvow.text增加了后缀(“!”)。
注意: exit()中有四个参数。当程序块中出现异常(exception),exit()的参数中exc_type, exc_value, traceback用于描述异常。我们可以根据这三个参数进行相应的处理。如果正常运行结束,这三个参数都是None。在我们的程序中,我们并没有用到这一特性。
- Python Study(02)之 Context Manager
- Python Context Manager
- Python上下文管理器Context Manager
- python: 上下文管理器(context manager)
- Python学习笔记(五)-- 上下文管理器(Context Manager)
- Python上下文管理器(context manager)一例
- python特性(十三):context manager的__enter__方法
- Python特性(十四):context manager的__exit__方法
- Python特性(十六):由生成器诱导的context manager
- Python Study (01) 之 特殊方法
- Python 之study
- Python学习8:上下文管理器(context manager)
- 十六、Python 上下文管理 Context Manager
- Python With语句 和context manager
- Python with语句及context manager
- context manager
- Python特性(十五): context manager的__exit__方法对异常的处理
- Oracle 12c Study之--Enterprise Manager Cloud Control Install
- Yii2.0小部件GridView(数据展示)①
- 5分钟在大米云上基于WordPress搭建一个博客
- Redis主从复制,哨兵,集群创建与增删操作
- 统计学习三要素——模型、策略、算法
- AIM Tech Round 4 (Div. 2) A. Diversity
- Python Study(02)之 Context Manager
- JAVA-初步认识01-第一章
- HDU 6161 (2017多校9
- 刻录光盘(Tarjan算法求强连通分量)
- 新的樱桃键盘 好想要啊
- RecyclerView
- 算法二十二
- 阿牛的EOF牛肉串 HDU
- js学习(15)----continue和label