Python----魔法函数__enter__/__exit__的用法

简介: Python----魔法函数__enter__/__exit__的用法

【原文链接】

1、with上下文管理器的用法

  • with用的最多的可能就是打开文件,读写文件的场景,如下代码:
with open("demo.txt","w+",encoding="utf8") as f:
    f.write("hello world")

其等同于如下代码:

f=open("demo.txt","w+",encoding="utf8")
f.write("hello world")
f.close()

使用with语句的时候不需要显式的去关闭文件资源,因为它自动会关闭,那么这个自动关闭是怎么实现的呢,这其实就是__enter__和__exit__魔法函数在起作用

2、\_\_enter__和__exit__魔法函数的工作原理

  • 以上面with as 的形式,那么首先是进入类函数中__enter__魔法函数,__enter__魔法函数返回结果赋值给as后面的变量,当with as 语句结束时,会自动调用__exit__魔法函数

下面重写写一个类似open的类,来实现with as 打开文件读写文件的实例,如下:


class OpenFile(object):
    def __init__(self,file_name="",mode="r",encoding="utf8",**kwargs):
        print("-----------------in init------------------")
        self.__file=open(file_name,mode,encoding=encoding)

    def __enter__(self):
        print("-----------------in enter ----------------")
        return self

    def write(self,ctx):
        print("-----------------begin write-------------")
        self.__file.write(ctx)
        print("-----------------finish write-------------")

    def __exit__(self,exec_type,exec_value,exec_tb):
        print("-----------------in exit------------------")
        self.__file.close()

with OpenFile("demo.txt","w+",encoding="utf8") as f:
    f.write("hello world")

执行结果如下:

-----------------in init------------------
-----------------in enter ----------------
-----------------begin write-------------
-----------------finish write-------------
-----------------in exit------------------

因此,如果想实现一个自定义的上下文管理器,只需要在自定义类中实现这两个魔法函数即可,这里有一个关键点需要理解的就是with as 语句中as 后面的变量就是__enter__魔法函数返回值,理解了这一点,就很容易实现自己的上下文管理器了

目录
相关文章
|
1天前
|
Python
【Python操作基础】——函数
【Python操作基础】——函数
|
1天前
|
Python
【Python操作基础】——while语句用法和pass语句
【Python操作基础】——while语句用法和pass语句
|
1天前
|
Python
【Python操作基础】——for语句用法
【Python操作基础】——for语句用法
|
1天前
|
Python
【Python操作基础】——if语句用法
【Python操作基础】——if语句用法
|
1天前
|
Python
Python的全局变量作用于整个程序,生命周期与程序相同,而局部变量仅限函数内部使用,随函数执行结束而销毁。
Python的全局变量作用于整个程序,生命周期与程序相同,而局部变量仅限函数内部使用,随函数执行结束而销毁。在函数内部修改全局变量需用`global`关键字声明,否则会创建新局部变量。
9 2
|
4天前
|
数据采集 NoSQL 中间件
python-scrapy框架(四)settings.py文件的用法详解实例
python-scrapy框架(四)settings.py文件的用法详解实例
9 0
|
4天前
|
存储 数据采集 数据库
python-scrapy框架(三)Pipeline文件的用法讲解
python-scrapy框架(三)Pipeline文件的用法讲解
7 0
|
4天前
|
存储 数据采集 JSON
python-scrapy框架(二)items文件夹的用法讲解
python-scrapy框架(二)items文件夹的用法讲解
11 0
|
4天前
|
数据采集 前端开发 中间件
python-scrapy框架(一)Spider文件夹的用法讲解
python-scrapy框架(一)Spider文件夹的用法讲解
10 0
|
4天前
|
Java C# 开发者
Python 中的类型注解是一种用于描述变量、函数参数和返回值预期类型的机制
Python的类型注解提升代码可读性和可维护性,虽非强制,但利于静态类型检查(如Mypy)。包括:变量注解、函数参数和返回值注解,使用内置或`typing`模块的复杂类型,自定义类型注解,以及泛型模拟。类型注解可在变量声明、函数定义和注释中使用,帮助避免类型错误,提高开发效率。
16 6