Python高级语法:with语句和上下文管理器

这篇具有很好参考价值的文章主要介绍了Python高级语法:with语句和上下文管理器。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一.文件操作: open写法

1.文件操作说明:

①文件使用完后必须关闭。

②因文件对象会占用操作系统的资源,并且操作系统同一时间能打开的文件数量也是有限的。

例如: 

# 1.以写的方式打开文件
f = open('python.txt', 'w', encoding = 'utf-8')
# 2.写入文件内容
f.write('人生苦短,我学python!!')
# 3.关闭文件
f.close()
2. 存在的安全隐患:

① 由于文件读写时都有可能产生IOError,一旦出错,后面的f.close()就不会调用。

例如:

# 1.以读的方式打开文件
f = open('python.txt', 'r', encoding = 'utf-8')
# 2.写入文件内容
f.read()
# 3.关闭文件
f.close()

运行结果:Python高级语法:with语句和上下文管理器,python

3.try…except…finally解决文件操作异常:

①为了保证无论是否出错都能正确地关闭文件,我们可以使用try ... finally来解决。 

②但是,try-except-finally语句缺点:代码过于冗长, 不易用,易忘。

例如:

try:
    # 1.尝试执行的代码
    f = open("python.txt", 'r', encoding='utf-8')
    print(f.read())
except IOError as e:
    # 2.出问题后的解决方案, 文件不存在就创建
    f = open("python.txt", 'w', encoding='utf-8')
finally:
    # 3.释放资源.
    f.close()

二.with语句

1.上下文管理器with语句:

该机制简单、更安全的处理资源和异常。

2.特点:

with 语句执行完成后,自动调用关闭文件操作,即使出现异常也会自动调用关闭文件操作。

# 1、以写的方式打开文件
with open("python.txt", "w", encoding='utf-8') as f:
    # 2、读取文件内容
    f.write("人生苦短,我学python!!")

三.上下文管理器原理

1.概述:

一个类只要实现了__enter__()和__exit__()这个两个方法,通过该类创建的对象我们就称之为上下文管理器。

2.原理:

上下文管理器可以使用 with 语句,with语句之所以这么强大,背后是由上下文管理器做支撑的。 刚才使用 open 函数创建的文件对象就是就是一个上下文管理器对象。  

大白话:with 管理的对象就是上下文管理器, with xxx as 后面的操作的对象就是被管理的对象。

例如:

# 1. 自定义上下文管理器类.
class MyFile:
    # 2. 重写 __init__()魔法方法, 初始化: file_name(文件名), file_model(文件模型)
    def __init__(self, file_name, file_model):
        """
        初始化属性的.
        :param file_name:   文件名
        :param file_model:  文件(操作)模型, r:只读, w:只写, a:追加
        """
        self.file_name = file_name
        self.file_model = file_model
        self.fp = None      # fp代表的文件对象.

    # 3. 重写 __enter__()函数, 表示: 上文. 即: with语句执行前, 做的事儿.
    def __enter__(self):
        print('这个是上文, 初始化属性的!')
        self.fp = open(self.file_name, self.file_model, encoding='utf-8')
        return self.fp    # fp就是文件对象.

    # 4. 重写 __exit__()函数, 表示: 下文, 即: with语句执行完毕后, 做的事儿.
    def __exit__(self, exc_type, exc_val, exc_tb): # 这些参数一个也用不到
        print('这个是下文, 释放资源的!')
        self.fp.close()

# # 5. 演示with open()语法, __enter__()返回的是: 文件对象
with MyFile('./1.txt', 'r') as fp:    # fp就是上边的 fp属性, 代表这文件对象.
    # 这里的内容执行完毕后, 会被自动释放资源.
    print('123')
    print(fp.read())

运行结果

Python高级语法:with语句和上下文管理器,python文章来源地址https://www.toymoban.com/news/detail-763673.html

3.技术细节
  • 一个类只要实现了__enter__()和__exit__()这个两个方法,通过该类创建的对象我们就称之为上下文管理器
  • _enter__表示上文方法,需要返回一个操作文件对象
  • __exit__表示下文方法,with语句执行完成会自动执行,即使出现异常也会执行该方法

到了这里,关于Python高级语法:with语句和上下文管理器的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Python教程(27)——如何使用Python中的上下文管理器

    当我们在编写代码时,经常会遇到需要管理资源的情况,比如打开和关闭文件,如果遇到了一些异常情况,我们需要关闭资源,不然会导致资源泄露,虽然我们可以通过手动的方式来关闭,但如果有多个异常情况需要考虑的话,万一不小心漏了一处,就芭比Q了。所以,如果有

    2024年02月19日
    浏览(37)
  • 【 Python 全栈开发 - WEB开发篇 - 38 】property和上下文管理器

    Python 是一个简洁而强大的编程语言,通过提供各种特性和工具,使开发人员能够更高效地进行编程。其中一个非常有用的特性是 @property 装饰器,它允许我们在类中定义属性并自定义其行为。 @property 装饰器用于将一个方法转换为类的属性。使用 @property 装饰器,我们可以像访

    2024年02月13日
    浏览(45)
  • 无限上下文,多级内存管理!突破ChatGPT等大语言模型上下文限制

    目前,ChatGPT、Llama 2、文心一言等主流大语言模型,因技术架构的问题上下文输入一直受到限制,即便是Claude 最多只支持10万token输入,这对于解读上百页报告、书籍、论文来说非常不方便。 为了解决这一难题,加州伯克利分校受操作系统的内存管理机制启发,提出了MemGPT。

    2024年02月06日
    浏览(44)
  • 【python】flask执行上下文context,请求上下文和应用上下文原理解析

    ✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN新星创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全栈,前后端开

    2024年03月26日
    浏览(38)
  • Zustand 和 React 上下文状态管理

    Zustand 是客户端全局状态管理的一个很棒的库。它简单、快速,并且包大小小。然而,有一件事我不一定喜欢它:这些 Store 是全局性的。 但这不是全局状态管理的重点吗?要使该状态在您的应用程序中随处可用。不过当我回顾过去几年中使用 zustand 的情况时,我意识到,更多

    2024年04月25日
    浏览(29)
  • pymysql 上下文管理器控制事务提交和回滚

    示例: 从上面例子看出, 在with结构进入时,事务开始begin 在with结构退出时,会根据是否产生异常进行commit和rollback操作,并关闭连接

    2024年01月25日
    浏览(45)
  • (二十)Flask之上下文管理第一篇(粗糙缕一遍源码)

    🏆🏆作者介绍:【孤寒者】—CSDN全栈领域优质创作者、HDZ核心组成员、华为云享专家Python全栈领域博主、CSDN原力计划作者 🔥🔥 本文已收录于Flask框架从入门到实战专栏 :《Flask框架从入门到实战》 🔥🔥 热门专栏推荐 :《Python全栈系列教程》、《Django框架从入门到实战

    2024年01月19日
    浏览(45)
  • 超长上下文处理:基于Transformer上下文处理常见方法梳理

    原文链接:芝士AI吃鱼 目前已经采用多种方法来增加Transformer的上下文长度,主要侧重于缓解注意力计算的二次复杂度。 例如,Transformer-XL通过缓存先前的上下文,并允许随着层数的增加线性扩展上下文。Longformer采用了一种注意力机制,使得token稀疏地关注远距离的token,从而

    2024年02月13日
    浏览(39)
  • 从零开始理解Linux中断架构(7)--- Linux执行上下文之中断上下文

            当前运行的loop是一条执行流,中断程序运行开启了另外一条执行流,从上一节得知这是三种跳转的第三类,这个是一个大跳转。对中断程序的基本要求就是 中断执行完毕后要恢复到原来执行的程序 ,除了时间流逝外,原来运行的程序应该毫无感知。        

    2024年02月11日
    浏览(47)
  • 〖大前端 - 基础入门三大核心之JS篇(51)〗- 面向对象之认识上下文与上下文规则

    说明:该文属于 大前端全栈架构白宝书专栏, 目前阶段免费 , 如需要项目实战或者是体系化资源,文末名片加V! 作者:哈哥撩编程,十余年工作经验, 从事过全栈研发、产品经理等工作,目前在公司担任研发部门CTO。 荣誉: 2022年度博客之星Top4、2023年度超级个体得主、谷

    2024年02月05日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包