Python深入02上下文管理器

上下文管理器(context manager)是Python2.5开始支持的一种语法,用于规定 某个对象的使用范围。一旦进入或者离开该使用范围,会有特殊操作被调用 (比如为对象分配或者释放内存)。它的语法形式是 with...as...

成都创新互联服务紧随时代发展步伐,进行技术革新和技术进步,经过十载的发展和积累,已经汇集了一批资深网站策划师、设计师、专业的网站实施团队以及高素质售后服务人员,并且完全形成了一套成熟的业务流程,能够完全依照客户要求对网站进行成都网站设计、成都网站建设、建设、维护、更新和改版,实现客户网站对外宣传展示的首要目的,并为客户企业品牌互联网化提供全面的解决方案。

关闭文件

我们会进行这样的操作:打开文件,读写,关闭文件。程序员经常会忘记关闭文件。上下文管理器可以在不需要文件的时候, 自动关闭文件。

下面我们看一下两段程序:

# without context manager
f = open( " new.txt ", " w " ) print(f.closed)               # whether the file is open
f.write( " Hello World! " ) f.close()
print(f.closed)
以及:
# with context manager
with open( " new.txt ", " w " ) as f:
    print(f.closed)    f.write( " Hello World! ")
print(f.closed)

两段程序实际上执行的是相同的操作。我们的第二段程序就使用了上下文管理器 ( with...as...)。上下文管理器有 隶属于它的程序块。当隶属的程序块执行结束的时候(也就是不再缩进),上下文管理器自动关闭了文件 (我们通过 f.closed来查询文件是否关闭)。我们相当于使用 缩进规定了文件对象f的 使用范围。

上面的上下文管理器基于f对象的 __exit__()特殊方法(还记得我们如何利用特殊方法来实现各种语法?参看 特殊方法与多范式)。当我们使用上下文管理器的语法时,我们实际上要求Python在进入程序块之前调用对象的 __enter__()方法,在结束程序块的时候调用 __exit__()方法。对于文件对象f来说,它定义了__enter__()和__exit__()方法(可以通过 dir(f)看到)。在f的__exit__()方法中,有 self.close() 语句。所以在使用上下文管理器时,我们就不用明文关闭f文件了。

自定义

任何定义了__enter__()和__exit__()方法的对象都可以用于上下文管理器。文件对象f是内置对象,所以f自动带有这两个特殊方法,不需要自定义。

下面,我们自定义用于上下文管理器的对象,就是下面的myvow:

# customized objectclass 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)

我们的运行结果如下:

I say: I'm fine
I say: I'm fine!

我们可以看到,在进入上下文和离开上下文时,对象的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。在我们的程序中,我们并没有用到这一特性。

总结:

通过上下文管理器,我们控制对象在程序不同区间的特性。上下文管理器( with EXPR as VAR)大致相当于如下流程:

# with EXPR as VAR:VAR = EXPR
VAR = VAR.__enter__()try:
    BLOCKfinally:
    VAR.__exit__()

由于上下文管理器带来的便利,它是一个值得使用的工具。

文章题目:Python深入02上下文管理器
URL分享:https://www.cdcxhl.com/article36/ipecsg.html

成都网站建设公司_创新互联,为您提供云服务器网站导航网站改版静态网站微信公众号营销型网站建设

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联

成都网页设计公司