美文网首页
Python33_上下文管理器

Python33_上下文管理器

作者: jxvl假装 | 来源:发表于2019-09-27 12:31 被阅读0次

上下文管理器

  • 上下文管理器的方法:
  1. __enter__进入的方法,负责一些更改
  2. __exit__退出方法,将进入时所做的更改还原

import sys


class LookingGlass:
    def __init__(self, *args):
        pass
        
    def __enter__(self):
        import sys
        self.original_write = sys.stdout.write  #系统的输入函数,输出到控制台
        sys.stdout.write = self.reverse_write
        return "Python is the best language"

    def reverse_write(self, text):
        self.original_write(text[::-1])

    def __exit__(self, exc_type, exc_val, exc_tb):
        """
        不管是否产生异常,exit一定会调用
        :param exc_type: 异常的类型
        :param exc_val: 异常的值,except ZeroDivisionError as data中的data就是异常的实例
        :param exc_tb: traceback对象,存储的是堆栈里面的错误信息
        :return:
        """
        sys.stdout.write = self.original_write
        return True #如果返回True则代表已经正确处理异常,如果返回True以外的其他值,则代表异常未处理,异常会层层上抛

with LookingGlass() as what:    #what存储了进入时返回的值。注意LookingGlass后面的括号
    # 对于上下文管理器,也可以对其像一个一般的类那样进行传参(如果init方法中定义了)
    print("hello world")    #逆序输出
    print(what) #这里会输出"Python is the best language"的逆序

print("hello world")    #因为已经退出了上下文环境,所以这里是正常输出

ps:用with打开文件即是一个上下文环境的运用。

  • 上下文环境的过程简化:contextlib

注意:

  1. 以yield为分界点,之前相当于enter的东西,之后的相当于exit的东西
import contextlib   #简化上述过程的包

@contextlib.contextmanager
def looking_glass():    #注意这里的定义方式类似于函数,而并非上面的类
    import sys
    original_write = sys.stdout.write   #和之前enter所做的事情一样

    def reverse_write(text):
        original_write(text[::-1])  #实现逆序输出

    sys.stdout.write = reverse_write    
    try:
        yield "Python is the best language" #以yield为分界点,之后的相当于__exit__中的代码,
        # yield的值相当于__enter__中的返回值,yield之前的代码相当于__enter__中的代码
    except Exception:
        print("处理异常...")
    sys.stdout.write = original_write

with looking_glass() as what:
    print("ABCDFG")
    print(what)

eg:对于套接字(网络编程部分)、文件描述符等珍贵的资源,可以结合上下文管理器进行释放或关闭等

相关文章

  • Python33_上下文管理器

    上下文管理器 上下文管理器的方法: __enter__进入的方法,负责一些更改 __exit__退出方法,将进入时...

  • Python上下文管理器

    上下文管理器 概念:实现了上下文协议的对象即为上下文管理器。 上下文管理器的协议: __enter__进入的方法_...

  • python上下文管理器细读

    test 1 上下文管理器,将生成器转化为上下文管理器 test 2 使用上下文管理器,抽象出异常处理 test ...

  • python中上下文管理器

    什么是上下文管理器? 代码的环境就是上下文,实现了上下文管理器协议的类产生的实例就是上下文管理器对象。在类中声名e...

  • Python的上下文管理器

    什么是上下文管理器 上下文管理器是一个对象,它定义了在执行 with 语句时要建立的运行时上下文。 上下文管理器处...

  • Python学习打call第三十一天:上下文管理器

    1.什么是上下文管理 上下文管理器是一个包装任意代码块的对象,上下文管理器保证进入上下文管理器时,每次代码执行的一...

  • python 上下文管理器

    一、什么是上下文管理器? 上下文管理器类型是python的内置类型之一,上下文管理器的定义:允许用户自定义类来定义...

  • python的上下文管理器

    上下文管理器的概念 上下文管理器的任务是代码块执行前准备,代码块执行后收拾。 如何使用上下文管理器? 如何使用上下...

  • Python上下文管理器

    1.与装饰器的区别 上下文管理器是装饰器的近亲,装饰器用于包装函数,上下文管理器用于包装任意代码块. 上下文管理器...

  • 算法面试 - 问题记录

    python上下文管理器,装饰器? (1)上下文管理器知乎链接:https://zhuanlan.zhihu.co...

网友评论

      本文标题:Python33_上下文管理器

      本文链接:https://www.haomeiwen.com/subject/dyhuuctx.html