python深入学习笔记2-上下文管理器

02、上下文管理器

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


  • 关闭文件
    普通做法:打开文件,读写,关闭文件。程序员经常会忘记关闭文件==。而上下文管理器可以在不需要文件的时候,自动关闭文件。

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

普通做法:

f=open("test.txt","a")
f.write("Hello World!")
f.close()#只有你记得写这句才会帮你关闭文件

使用文件管理器:

with open("test.txt.txt","a") as f:
    print(f.closed)
    f.write("DXT") #这里!执行完这句后文件关闭,但是f这个引用还是存在的!

print(f.closed)# <--所以

输出:
False
True

with…as会帮你自动关闭文件,而且代码好像看起来更简洁了^_^

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


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

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

class VOW(object):
    def __init__(self,text):
        self.text=text

    def __enter__(self):
        print("__enter__")
        self.text="I say:"+self.text
        return self

    def __exit__(self,type,value,traceback):
        self.text=self.text+"!"

with VOW("Hollo") as myvow:  #VOW("Hollo")返回对象self(此时self.text="I say:"+"Hollo")给到 myvow
    print(myvow.text)
    #执行完这句后,自动调用__exit__()(此时self.text="I say Hollo"+"!")

print(myvow.text)#所以再次print(myvow.text)时,myvow.text=I say Hollo!"

输出:
__enter__
I say:Hollo
__exit__

I say:Hollo!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值