首页 > 编程语言 >python 魔术方法__enter__及__exit__上下文管理方法

python 魔术方法__enter__及__exit__上下文管理方法

时间:2022-11-02 19:55:06浏览次数:39  
标签:__ python self exit mode enter 上下文



上下文管理器协议 __enter__ __exit__方法
with:上下文管理器协议:
__enter__:进入上下文(with操作对象时)
__exit__:退出上下文(with中的代码块执行完毕之后)
with是用来启动对象的上下文协议的,不是用来专门操作文件的

使用with语句的时候不需要显式的去关闭文件资源,因为它自动会关闭,
那么这个自动关闭是怎么实现的呢,这其实就是__enter__和__exit
__魔法方法在起作用.
with as 语句中as 后面的变量就是__enter__魔法函数返回值

with open("text.txt", mode="r", encoding="utf-8")as a:  # __enter__:进入上下文(with操作对象时)
      那么此时a 就是enter方法的返回值,进入上下文的
     print(a.read())  # 执行对象当中的内容

print(a.read())
此时在我with执行完成 之后会调用__exit__方法,结束会话,此时在外部调用时,提示异常
ValueError: I/O operation on closed file. #文件没有打开

  

自定义一个实现读取文件关闭的方法



class OpenFile:


    def __init__(self,filepath,mode,encoding="utf-8"):
        self.file =  open(file=filepath,mode=mode,encoding=encoding)

    def __enter__(self):
        print("-------------进入上下文会话------------")
        return self.file.read()

    def __exit__(self, exc_type, exc_val, exc_tb):
        self.file.close()
        print("-------------结束上下文会话------------")


# a = OpenFile("text.txt", mode="r", encoding="utf-8")
# with a as s:
#     print(s)

"""
输出结果:
-------------进入上下文会话------------
dddd
pppp
-------------结束上下文会话------------

"""

  

 

标签:__,python,self,exit,mode,enter,上下文
From: https://www.cnblogs.com/manxingsir/p/16852193.html

相关文章

  • ida flare_emu模拟执行批量解密字符串(Orchard_Botnet)
    ......
  • Oeasyvim - 如打怪一般的学习
    Oeasyvim-如打怪一般的学习项目地址:https://github.com/TonyK922/oeasy-vim-tutorial这是overmind1980做的一个vim入手到进阶的教程很适合vim初学者.项目共98章......
  • winserver 跳板机ip端口映射
    跳板机cmd命令记录netstart"IPHelper"请求的服务已经启动netshinterfaceportproxyaddv4tov4listenport=8080connectaddress=10.202.150.83connectport=8080n......
  • 回溯去重
    1.参考代码随想录2.回溯法经典问题组合问题:N个数里面按一定规则找出k个数的集合排列问题:N个数按一定规则全排列,有几种排列方式切割问题:一个字符串按一定规则有几种......
  • P8671 [蓝桥杯 2018 国 AC] 约瑟夫环 题解
    约瑟夫环有\(\mathcalO(n)\)做法相信大家都知道。这里就不在介绍了,这里给出一个不知道这个结论的\(\mathcalO(n\logn)\)简单做法。考虑直接模拟题意,每次循环往后数......
  • 18. Spring之IOC底层实现
    一、反射机制1.1、创建JavaBean类packagestar.light.pojo;publicclassUser{privateStringname;privateintage;publicUser(){}pu......
  • 20201317 LYX 第12章 块设备I/O和缓冲区管理
    第12章块设备I/O和缓冲区管理知识总结解释块设备I/O的原理和I/O缓冲的优点介绍Unix的缓冲区管理算法利用信号量设计新的缓冲区管理算法,以提高I/O缓冲区的缓存效率和......
  • docker
    一、概念docker是一个开源的应用容器引擎,基于go语言开发并遵循了apache2.0协议开源。docker可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布......
  • 面向对象
    Day27面向对象内容概要面向对象编程思想面向对象类与对象面向对象代码实操对象的独有数据对象独有的方法详细内容面向对象编程思想面向过程编程与面向对象编......
  • 嵌入式-C语言基础:字符串拼接函数strcat
    #include<stdio.h>#include<string.h>//实现字符串拼接char*mystrcat(char*dest,char*src){char*bak=dest;if(dest==NULL||src==NULL){......