IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> 上下文管理器和with块 -> 正文阅读

[Python知识库]上下文管理器和with块

文章目录


前言

相信很多小伙伴在对文件操作,或者锁的操作时会经常用到with语句,因为使用它给我们带来了极大的便利,比如在文件操作中,使用它,你再也不用担心你的文件在使用完成后没有关闭;在锁的操作,你也再也不用担心开了一把锁而忘记关闭造成死锁等现象...总之,它会给你做好一切“善后”的事情哈哈哈哈(这个比喻可能不是那么恰当)

一、上下文管理器是什么?

上下文管理器对象存在的目的是管理with语句,就像迭代器的存在是为了管理for语句一样。

它包含两个协议:__enter__和__exit__方法。with语句开始时,会在上下文中调用__enter__方法,with语句结束后,会调用__exit__方法。

二、使用步骤

这里列出两个实例,两个栗子的目的都是为了在控制中镜像输出。

1.上下文管理器的实现方案一

# 实现一个镜像输出
import sys
class MirrorOutput:

    def __enter__(self):
        self.output = sys.stdout.write  # 定义一个变量用来接受系统的输出方法
        sys.stdout.write = self.__reverse_output__  # 将系统的输出方法改为自己定义的输出方法

    def __reverse_output__(self, text):
        return self.output(text[::-1])

    def __exit__(self, exc_type, exc_val, exc_tb):
        sys.stdout.write = self.output  # 退出上下文后将系统的输出方法还原


if __name__ == '__main__':
    with MirrorOutput() as mo:
        print('好好学习,天天向上!')

    print('好好学习,天天向上!')

根据with语句的执行步骤,我们只要实现__enter__和__exit__方法,就可以实现一个上下文管理器。

在__enter__中,我们定义一个变量用来保系统的输出方法,同时将系统的输出方法改为我们自己的定义的输出方法(镜像输出),这样,在with语句内部,只要是在控制台输出的内容,都是镜像的。

在__exit__中,我们将系统的输出方法还原为它原有的方法,保证系统的正确性。在with语句以外的输出方法就是正常的了。

2.上下文管理器的实现方案二

import sys
from contextlib import contextmanager


# 还是实现一个镜像输出
class MirrorOutput:

    @contextmanager
    def mirror_output(self):

        self.output = sys.stdout.write

        def reverse_output(text):
            return self.output(text[::-1])

        sys.stdout.write = reverse_output

        # 分界线以上的作用类似于__enter__方法
        yield "这里是分界线"  # yield产出的值会绑定在as字句的目标变量上
        # 分界线以下的作用类似于__exit__方法
        sys.stdout.write = self.output


if __name__ == '__main__':
    with MirrorOutput().mirror_output() as mo:
        print('好好学习,天天向上!')

        print(mo)
    print('好好学习,天天向上!')

这里使用了@contextlib.contextmanager装饰器以及yield关键字来实现上下文管理,在yield关键字以上的部分充当__enter__方法,在yield方法以下的部分充当__exit__方法,而yield关键词产出的值会交给as子句后面指定的变量。

总结

虽然with语句在我们的代码中频繁会被用到,但是其间的实现过程可能还不是很懂,希望这一文章会在你以后使用with语句时会有所帮助!

同步更新于个人博客系统:上下文管理器和with块

  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2022-04-26 11:38:17  更:2022-04-26 11:41:01 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 16:57:11-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码