Python上下文管理器实现方法总结

 更新时间:2021年07月18日 09:23:42   作者:有关心情  
在本篇文章里小编给大家整理的是关于Python上下文管理器实现方法总结内容,有兴趣的朋友们可以学习参考下。

什么时候可以考虑上下文管理器

当你的代码逻辑需要用到如下关键字时,可以考虑使用上下文管理器让你的代码更加优雅:

try:
	...
finally:
	...

接下来介绍实现上下文管理器的三种方法。

方法1(上下文管理器协议)

总所周知,open()是默认支持上下文管理器的。所以打开一个txt文件,并向里面写入内容,再关闭这个文件的代码可以这样写:

with open("1.txt", "w") as file:
file.write("this is a demo")

这是等同于:

file = None
try:
    file = open("1.txt", "w")
    file.write("this is a demo")
finally:
    file.close()

要在Python中实现with语句的使用,就需要借助上下文管理器协议。也就是需要实现__enter__和__exit__两个魔法方法。

class OpenMyFile(object):
    def __init__(self, path):
        self.path = path

    def __enter__(self):
        print("opening the txt")
        self.f = open(self.path, "w")
        return self

    def __exit__(self, *args, **kwargs):
        print("closing the txt")
        self.f.close()

    def write(self, string):
        print("writing...")
        self.f.write(string)


with OpenMyFile("2.txt") as file:
    file.write("this is a demo2")

# 输出:
opening the txt
writing...
closing the txt

同时能够看到本地生成了2.txt文件。需要注意的是,__enter__得return实例对象,不然会报异常:AttributeError: 'NoneType' object has no attribute 'write'

这是因为Python中的函数默认返回None。

方法2(@contextmanager)

利用contextlib中的contextmanager装饰器。

from contextlib import contextmanager


@contextmanager
def open_my_file(path):
    print("opening the txt")
    f = open("3.txt", "w")
    yield f
    print("closing the txt")
    f.close()


with open_my_file("3.txt") as file:
    file.write("this is demo3")

# 输出:
opening the txt
closing the txt

在@contextmanager装饰的函数中,需要用yield隔开两个逻辑语句。这里yield出来的对象会被as后面的变量接收。

方法3(contextlib.closing())

利用contextlib中的closing()方法。

from contextlib import closing


class OpenMyFile(object):
    def __init__(self, path):
        print("opening the txt")
        self.f = open(path, "w")

    def write(self, string):
        self.f.write(string)

    def close(self):
        print("closing the txt")
        self.f.close()


with closing(OpenMyFile("4.txt")) as file:
    file.write("this is demo4")

# 输出:
opening the txt
closing the txt

与方法1不同。经过closing()方法包装过后,在with语句结束时,会强制调用对象的close()方法。所以使用方法3时,需要定义的方法不是__exit__()而是close()。

到此这篇关于Python上下文管理器实现方法总结的文章就介绍到这了,更多相关Python上下文管理器实现的三种方法内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 使用GitHub和Python实现持续部署的方法

    使用GitHub和Python实现持续部署的方法

    这篇文章主要介绍了使用GitHub和Python实现持续部署的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-05-05
  • 新手常见Python错误及异常解决处理方案

    新手常见Python错误及异常解决处理方案

    这篇文章主要介绍了新手常见Python错误及异常解决处理方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-06-06
  • 解决Keras 自定义层时遇到版本的问题

    解决Keras 自定义层时遇到版本的问题

    这篇文章主要介绍了解决Keras 自定义层时遇到版本的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-06-06
  • Python 没有main函数的原因

    Python 没有main函数的原因

    这篇文章主要介绍了Python 没有main函数的原因,文中讲解非常详细,示例代码帮助大家更好的理解和学习,感兴趣的朋友可以了解下
    2020-07-07
  • 使用Python获取当前工作目录和执行命令的位置

    使用Python获取当前工作目录和执行命令的位置

    这篇文章主要介绍了使用Python获取当前工作目录和执行命令的位置,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-03-03
  • 详解Python的Django框架中的Cookie相关处理

    详解Python的Django框架中的Cookie相关处理

    这篇文章主要介绍了详解Python的Django框架中的Cookie相关处理,Cookie存储是每个开发框架都会着重注意的重要功能,需要的朋友可以参考下
    2015-07-07
  • 基于python3的socket聊天编程

    基于python3的socket聊天编程

    这篇文章主要为大家详细介绍了基于python3的socket聊天编程,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-02-02
  • 详解如何使用Pandas创建有效且可复制的代码

    详解如何使用Pandas创建有效且可复制的代码

    Pandas作为一种多功能和强大的工具而屹立不倒,其直观的数据结构和广泛的功能使其成为无数数据专业人士和爱好者的首选,本文将使用Pandas创建有效且可复制的代码,感兴趣的可以了解下
    2024-11-11
  • pymongo中group by的操作方法教程

    pymongo中group by的操作方法教程

    这篇文章主要给大家介绍了关于pymongo中group by的操作方法,文中通过示例代码介绍的非常详细,对大家学习或者使用pymongo具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-03-03
  • opencv基于Haar人脸检测和眼睛检测

    opencv基于Haar人脸检测和眼睛检测

    这篇文章主要为大家详细介绍了opencv基于Haar人脸检测和眼睛检测,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-09-09

最新评论