python 手动实现with 语句的两个方式

python中with语句用的最多的一般是在打开文件的时候,使用with可以在退出这个语句块的时候自动释放文件句柄。

想想这种自动释放确实很方面,在其他一些需要占用系统资源或者IO的地方很值得一用。

总结下两个实现with语句的方法。

 

1. 使用__enter__ 和 __exit__

class OpenFile():
    def __init__(self,filename):
        self.filename = filename
        self.fp = None

    def __enter__(self):
        self.fp = open(self.filename,'w+')
        return self.fp

    def __exit__(self,exc_type,exc_val,exc_tb):
        self.fp.close()

if __name__ == "__main__":
    with OpenFile("2.txt") as f:
        f.write("test")

2. 使用装饰器contextmanager

使用with时,会执行到yield处,知道运行到with语句块结束时,会从yield处往下执行

from contextlib import contextmanager

@contextmanager
def self_file_open():
    try:
        fp = open("1.txt",'w+')
        yield fp
    except Exception as e:
        raise e
    finally:
        fp.close()

 

 

 

值得一提的是,with ... as ... 中的as取决于 __enter__ return的值 或者 yield返回的值。。如果无return或yield,那么as 就没意义。

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值