电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

Python上下文管理器Content Manager

瀏覽:105日期:2022-06-15 17:40:50

在 Python 中,我們會經常聽到上下文管理器(Context Manager),那我們探討下這是什么,又有什么功能。

在 Python 中的上下文管理器中,使用 with 打開文件是使用最多的,其中離開 with 包含的語句后會執行一些類似于清理的工作,如關閉文件,關閉連接對象等操作。

實踐

我們在代碼實踐的時候,忽略了在同一代碼片段中,先打開文件,然后直接對文件進行其他處理,因為這樣沒有任何意義,資源是處于被占用的情況。

先看下面檢測的代碼:

#!/usr/bin/env python# _*_ coding: UTF-8 _*_# MedusaSorcerer Scriptimport osclass OpenFile: def __init__(self):self.file = None def open(self, path):self.file = open(path, ’w’)if __name__ == ’__main__’: file_path = ’medusa.md’ file = OpenFile() file.open(file_path) os.remove(file_path)

代碼中我們把文件對象,進行了實例屬性的方式引用,在此之后,我們使用 os 模塊進行刪除被寫入的文件。執行改代碼片段后,會出現以下內容:

Traceback (most recent call last): File 'medusa/main.py', line 19, in <module> os.remove(file_path)PermissionError: [WinError 32] 另一個程序正在使用此文件,進程無法訪問。: ’medusa.md’

Process finished with exit code 1

那是因為被刪除的文件沒有得到資源釋放。我們在上面的基礎上進行套用函數的方式:

#!/usr/bin/env python# _*_ coding: UTF-8 _*_# MedusaSorcerer Scriptimport osclass OpenFile: def __init__(self):self.file = None def open(self, path):self.file = open(path, ’w’)def open_file(path): file = OpenFile() file.open(path)if __name__ == ’__main__’: file_path = ’medusa.md’ open_file(file_path) os.remove(file_path)

這段代碼會成功的被執行成功,原因是當你執行函數的時候,函數內的臨時變量將被回收釋放,因此 OpenFile 的實例對象被釋放了,實例屬性也就不存在而被釋放,所以會執行成功。

那是否我們的操作都應該使用函數包裹的方式執行呢?with 的出現,完美解決了這個問題:

#!/usr/bin/env python# _*_ coding: UTF-8 _*_# MedusaSorcerer Scriptimport osif __name__ == ’__main__’: file_path = ’medusa.md’ with open(file_path, ’w’) as f:print(f) os.remove(file_path)

在 with 語法中,將后面打開文件的操作,返回的文件對象,賦值給 f 變量,在結構體中輸出了 f 變量的內容,并且在結構體外刪除了該文件:

medusapython.exe medusa/main.py<_io.TextIOWrapper name=’medusa.md’ mode=’w’ encoding=’cp936’>

Process finished with exit code 0

在沒有使用 close() 的情況下,依舊可以對文件進行刪除,這就是上下文管理的美妙。

實現

上下文管理,實際上是實現了 __enter__ 和 __exit__ 方法:

#!/usr/bin/env python# _*_ coding: UTF-8 _*_# MedusaSorcerer Scriptclass Medusa: def __init__(self):print(’__init__’) def __enter__(self):print(’__enter__’) def __exit__(self, exc_type, exc_val, exc_tb):print(’__exit__’)if __name__ == ’__main__’: medusa = Medusa() with medusa:print(’with object’) print(’finish’)

以下是輸出結果:

__init____enter__with object__exit__finish

我們發現魔法方法在結合某些語法后會發生自動調度,所以,上下文管理中就在自動調度中,關閉了某些對象。

優點

實現上下文管理可以簡化我們的代碼,讓代碼更加簡單易讀,使用最少的代碼量,就可以完成全部工作。

到此這篇關于Python上下文管理器Content Manager的文章就介紹到這了,更多相關Python上下文管理器內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Python 編程
相關文章:
主站蜘蛛池模板: 美能达分光测色仪_爱色丽分光测色仪-苏州方特电子科技有限公司 | 杭州厂房降温,车间降温设备,车间通风降温,厂房降温方案,杭州嘉友实业爽风品牌 | 湖南印刷厂|长沙印刷公司|画册印刷|挂历印刷|台历印刷|杂志印刷-乐成印刷 | 精密机械零件加工_CNC加工_精密加工_数控车床加工_精密机械加工_机械零部件加工厂 | 压接机|高精度压接机|手动压接机|昆明可耐特科技有限公司[官网] 胶泥瓷砖胶,轻质粉刷石膏,嵌缝石膏厂家,腻子粉批发,永康家德兴,永康市家德兴建材厂 | 钢骨架轻型板_膨石轻型板_钢骨架轻型板价格_恒道新材料 | 周易算网-八字测算网 - 周易算网-宝宝起名取名测名字周易八字测算网 | ETFE膜结构_PTFE膜结构_空间钢结构_膜结构_张拉膜_浙江萬豪空间结构集团有限公司 | 校服厂家,英伦校服定做工厂,园服生产定制厂商-东莞市艾咪天使校服 | 集装箱展厅-住人集装箱住宿|建筑|房屋|集装箱售楼处-山东锐嘉科技工程有限公司 | 上海宿田自动化设备有限公司-双面/平面/单面贴标机 | 丝杆升降机-不锈钢丝杆升降机-非标定制丝杆升降机厂家-山东鑫光减速机有限公司 | 广州二手电缆线回收,旧电缆回收,广州铜线回收-广东益福电缆线回收公司 | 净气型药品柜-试剂柜-无管道净气型通风柜-苏州毕恩思 | 炉门刀边腹板,焦化设备配件,焦化焦炉设备_沧州瑞创机械制造有限公司 | 大巴租车平台承接包车,通勤班车,巴士租赁业务 - 鸿鸣巴士 | 解放卡车|出口|济南重汽|报价大全|山东三维商贸有限公司 | 企业管理培训,企业培训公开课,企业内训课程,企业培训师 - 名课堂企业管理培训网 | 120kv/2mA直流高压发生器-60kv/2mA-30kva/50kv工频耐压试验装置-旭明电工 | 液晶拼接屏厂家_拼接屏品牌_拼接屏价格_监控大屏—北京维康 | 一点车讯-汽车网站,每天一点最新车讯! | 机构创新组合设计实验台_液压实验台_气动实训台-戴育教仪厂 | 开业庆典_舞龙舞狮_乔迁奠基仪式_开工仪式-神挚龙狮鼓乐文化传媒 | 重庆LED显示屏_显示屏安装公司_重庆LED显示屏批发-彩光科技公司 重庆钣金加工厂家首页-专业定做监控电视墙_操作台 | 浙江美尔凯特智能厨卫股份有限公司 | 滚筒烘干机_转筒烘干机_滚筒干燥机_转筒干燥机_回转烘干机_回转干燥机-设备生产厂家 | 【ph计】|在线ph计|工业ph计|ph计厂家|ph计价格|酸度计生产厂家_武汉吉尔德科技有限公司 | 自动化改造_智虎机器人_灌装机_贴标机-上海圣起包装机械 | 万烁建筑设计院-建筑设计公司加盟,设计院加盟分公司,市政设计加盟 | 欧版反击式破碎机-欧版反击破-矿山石料破碎生产线-青州奥凯诺机械 | 重庆LED显示屏_显示屏安装公司_重庆LED显示屏批发-彩光科技公司 重庆钣金加工厂家首页-专业定做监控电视墙_操作台 | TPM咨询,精益生产管理,5S,6S现场管理培训_华谋咨询公司 | 科箭WMS仓库管理软件-TMS物流管理系统-科箭SaaS云服务 | 精密冲床,高速冲床等冲压设备生产商-常州晋志德压力机厂 | 武汉高温老化房,恒温恒湿试验箱,冷热冲击试验箱-武汉安德信检测设备有限公司 | 二维运动混料机,加热型混料机,干粉混料机-南京腾阳干燥设备厂 | 液压压力机,液压折弯机,液压剪板机,模锻液压机-鲁南新力机床有限公司 | 上海小程序开发-小程序制作-上海小程序定制开发公司-微信商城小程序-上海咏熠 | 精准猎取科技资讯,高效阅读科技新闻_科技猎 | 金现代信息产业股份有限公司--数字化解决方案供应商 | 长春网站建设,五合一网站设计制作,免费优化推广-长春网站建设 |