前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >(三十九) 初遇python之Context Managers上下文管理器

(三十九) 初遇python之Context Managers上下文管理器

作者头像
XXXX-user
修改2019-07-30 10:49:34
5460
修改2019-07-30 10:49:34
举报
文章被收录于专栏:不仅仅是python

各位读者大大们大家好,今天学习python的Context Managers上下文管理器,并记录学习过程欢迎大家一起交流分享。

新建一个python文件命名为py3_contextmanager.py,在这个文件中进行操作代码编写:

代码语言:javascript
复制
# Context Managers上下文管理器
#用来有效的管理资源,之前在讲文件读写操作中
#有提到过
#现在以文件读写为例
#演示 Context Managers上下文管理器
#普通的文件写入操作:
f = open('test.txt','w') 
f.write('写入数据到文件!')
f.close()
#接下来使用 Context Managers的方式完成:
with open('test_new.txt','w') as f:
  f.write('写入数据到文件!')
#这里我们并没有去写关闭文件的操作
#因为当我们完成自己的代码操作,退出
#with上下文管理器后,文件会自动关闭
#上下文管理器常用在数据库的连接关闭
#还可以获取释放锁等操作

#接下来我们自定义一个上下文管理器类
#用来打开文件
class Open_File():
  #初始化文件名和文件打开的模式
  def __init__(self,filename,mode):
    self.filename = filename
    self.mode = mode
  #设置上下文管理器的实际操作
  #打开文件  
  def __enter__(self):
    self.file = open(self.filename,self.mode)
    return self.file
  #退出管理器时,执行关闭文件操作
  def __exit__(self,exc_type,exc_val,traceback):
    self.file.close()
#使用上下文管理器
#with这行代码块实际执行了
#Open_File类中的 __init__
#__enter__两个方法
with Open_File('sample.txt','w') as f:
  f.write('testing')
#我们打印文件的状态
print(f.closed)#True

#接下来使用装饰器来重写上面的
#自定义上下文管理器
#需要导入模块contexlib
from contextlib import contextmanager

@contextmanager
def open_file(file,mode):
  try:
    f = open(file,mode)
    yield f
  finally:
    f.close()
#调用管理器
with open_file('sample_new.txt','w') as wf:
  wf.write('写入数据!')
print(wf.closed)

#接下来看一个os模块中的操作
import os

#获取当前工作目录
cwd = os.getcwd()
#切换到指定目录test1
os.chdir('test1')
#列出该目录中的所有内容
print(os.listdir())
#切换回当前工作目录
os.chdir(cwd)

#获取当前工作目录
cwd = os.getcwd()
#切换到指定目录test2
os.chdir('test2')
#列出该目录中的所有内容
print(os.listdir())
#切换回当前工作目录
os.chdir(cwd)
#我们要做同样的事情很多次
#运行我们得到结果如下:
#['test1.doc', 'test1.txt']
#['test2.doc', 'test2.txt']
#上边的代码逻辑非常适合
#使用上下文管理器实现
#修改如下:
@contextmanager
def change_dir(destination):
  try:
    cwd = os.getcwd()
    os.chdir(destination)
    #这里yield返回所有
    yield
  finally:
    os.chdir(cwd)
#调用:
with change_dir('test1'):
  print(os.listdir())
with change_dir('test2'):
  print(os.listdir())

今天初学python的Context Managers上下文管理器学习就到这里!

关注公号

下面的是我的公众号二维码图片,欢迎关注。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-06-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 yale记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 关注公号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档