Python with语句

with 语句介绍:

python的with语句是一种用于简化资源管理的语法结构。

它主要用于确保在代码块执行完毕后,正确地释放资源,例如文件操作、锁、网络连接等。

with语句可以确保即使在发生异常的情况下,资源也能被正确地关闭和清理。

只要一个类实现了以下两个方法就可以使用with语句。

def __enter__(self):
    pass
def __exit__(self, exc_type, exc_value, traceback):
    pass

一般是上下文协议的对象或者资源管理器中使用with

实现了__enter____exit__都是上下文或者资源管理器。

常见的使用

with open('a.txt', 'r') as f:
    content = f.read()
    print(content)

使用open函数以只读模式 打开文件a.txtwith语句确保文件在操作完成后会被正确关闭,即使发生异常也是如此。文件的内容被读取到content变量中。打印出文件的内容。

显然这是没有营养的~


不知道我们没有思考过这么一个问题?上述代码中的f变量是一个什么是东西?

我在刚接触python的这个语法的时候,会认为f就是open()对象的返回值。后来发现是我肤浅了。

看下这段代码,自定义一个资源管理器类实现__enter____exit__

class MyResourceManager:

    def __enter__(self):
        print("Resource is being init...")
        a = 1
        print(a) # 1

    def __exit__(self, exc_type, exc_value, traceback):
        b = 2
        print(b) # 2
        print("Resource is being cleaned up.")

with MyResourceManager() as resource:  
    print("Using the resource")
    print(type(resource))  # <class 'NoneType'>
    print(resource)        # None

print("Test End")

你会发现这里的resource是一个None, 按道理应该是MyResourceManager类型的。

直接说一下结果,with MyResourceManager() as resource这里的resourceMyResourceManager__enter__函数的返回值。大部分使用with好像都是前面对象本身的类型,那是因为__enter__函数返回了self对象本身。

with XX as resource 不是上下文或资源管理器对象,是enter方法的返回值

在看份代码,也许还会有发现~


class MyResourceManager:
    test_lst = ["a", "b", 12]

    def __enter__(self):
        print("Resource is being init...")
        print(self.test_lst) # ['a', 'b', 12]
        return self

    def __exit__(self, exc_type, exc_value, traceback):
        self.test_lst[2] = "c"
        print("Resource is being cleaned up")


with MyResourceManager() as resource:
    print("Using the resource")
    print(type(resource))    # <class '__main__.MyResourceManager'>
    print(resource.test_lst) # ['a', 'b', 12]
    lst = resource.test_lst  # 取资源管理器里面的值 
    print(lst)               # ['a', 'b', 12]

print(lst)                   # ['a', 'b', 'c']
print("Test End")

看到这里我想with语句就应该差不多了,为什么倒数第二行打印是['a', 'b', 'c']

with语句在进入时候会执行__enter__ 在离开的时候会执行__exit__
显然在上述代码中with结束的时候,对test_lst进行了修改,test_lst变量是一个对象,所以with结束的时候,外部lst的值会发生改变。

最后一个问题,如果上述代码test_lst改成intstrwith离开时修改test_lst,最后with外打印的lst值会变吗?
在线等你的答案~

  • 6
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值