Python上下文管理器类和上下文管理器装饰器contextmanager用法实例分析
作者:weixin_42359464 发布时间:2022-05-01 15:04:21
本文实例讲述了Python上下文管理器类和上下文管理器装饰器contextmanager用法。分享给大家供大家参考,具体如下:
一. 什么是上下文管理器
上下文管理器是在Python2.5之后加入的功能,可以在方便的需要的时候比较精确地分配和释放资源, with便是上下文管理器的最广泛的应用, 比如:
with open("test/test.txt","w") as f:
f.write("hello")
这上会比使用try:...finally:f.close
方便的多.
二. 自定义一个上下文管理器类:
class MyResource:
# __enter__ 返回的对象会被with语句中as后的变量接受
def __enter__(self):
print('connect to resource')
return self
def __exit__(self, exc_type, exc_value, tb):
print('close resource conection')
def query(self):
print('query data')
类中有两个特殊的魔术方法:
__enter__: with语句中的代码块执行前, 会执行__enter__, 返回的值将赋值给with句中as后的变量.
__exit__: with语句中的代码块执行结束或出错, 会执行_exit__
比如以下代码:
with Myresource() as r:
r.query()
的打印结果为:
connect to resource
query data
close resource conection
那么有没有一个简化定义的方法呢, python提供了一个装饰器contextmanager
三. 使用contextmanager
from contextlib import contextmanager
class MyResource:
def query(self):
print('query data')
@contextmanager
def make_myresource():
print('start to connect')
yield MyResource()
print('end connect')
pass
被装饰器装饰的函数分为三部分:
with语句中的代码块执行前执行函数中yield之前代码
yield返回的内容复制给as之后的变量
with代码块执行完毕后执行函数中yield之后的代码
比如下方代码:
with make_myresource() as r:
r.query()
的结果为:
start to connect
query data
end connect
四. 一个例子, sqlalchemy: 数据库的自动提交和回滚
在编程中如果频繁的修改数据库, 一味的使用类似try:... except..: rollback() raise e
其实是不太好的.
比如某一段的代码的是这样的:
try:
gift = Gift()
gift.isbn = isbn
...
db.session.add(gift)
db.session.commit()
except Exception as e:
db.session.rollback()
raise e
为了达到使用with语句的目的, 我们可以重写db所属的类:
from flask_sqlalchemy import SQLAlchemy as _SQLALchemy
class SQLAlchemy(_SQLALchemy):
@contextmanager
def auto_commit(self):
try:
yield
self.session.commit()
except Exception as e:
db.session.rollback()
raise e
这时候, 在执行数据的修改的时候便可以:
with db.auto_commit():
gift = Gift()
gift.isbn = isbndb.session.add(gift)
db.session.add(gift)
with db.auto_commit():
user = User()
user.set_attrs(form.data)
db.session.add(user)
关于Python相关内容感兴趣的读者可查看本站专题:《Python函数使用技巧总结》、《Python面向对象程序设计入门与进阶教程》、《Python数据结构与算法教程》、《Python字符串操作技巧汇总》、《Python编码操作技巧总结》及《Python入门与进阶经典教程》
希望本文所述对大家Python程序设计有所帮助。
来源:https://blog.csdn.net/weixin_42359464/article/details/80742387


猜你喜欢
- Typora是什么?Typora是一款支持实时预览的Markdown文本编辑器。支持即时渲染技术,这也是与其他Markdown编辑器最显著的
- 在登陆PLSQL Developer时报ora-12513错误,需要修改本地数据库的监听配置文件,其过程相对简单。在Oracle安装目录中搜
- 原文地址:How to write Dockerfiles for Python Web Apps原文作者:Praveen Durairaj
- 前言本文主要介绍的是Python如何使用zip函数同时遍历多个迭代器,文中的版本为Python3,zip函数是Python内置的函数。下面话
- 1.前提条件    本文是在安装了Anaconda3的环境下,使用P
- 需要selenium控制的chrome向下滑动,自动加载一些内容,核心代码是:browser.execute_script("wi
- 我的数据库如图结构我取了其中的name age nr,做成array,只要所取数据存在str型,那么取出的数据,全部转化为str型,也就是a
- vue提供的了transition组件来实现组件的过渡和路由的过渡,合理使用这个组建可以让我们的页面更加的灵活,提高用户体验。概念在进入/离
- 代码执行结构为顺序结构、选择结构、循环结构。python判断选择结构【if】if 判断条件 #进行判断条件满足之后执行下方语句 执行语句el
- 写在前面:这次我主要想总结一下微信小程序实现上下滚动消息提醒,主要是利用swiper组件来实现,swiper组件在小程序中是滑块视图容器。我
- 2018年1月3日,王思聪被迫动用自己的微博,为一个诞生不到10天的App打了广告,“每天我都发奖金,今晚9点就发10万”。对他而言,这天的
- ALTER TABLE允许你修改一个现有表的结构。例如,你可以增加或删除列、创造或消去索引、改变现有列的类型、或重新命名列或表本身。你也能改
- 雅虎的BrowserPlus在曝光了N久后终于发布了,一款类似于Google Gears的浏览器增强插件。在支持的操作系统方面,Gears明
- 在运行这样类似的代码:#!/usr/bin/env pythons="中文"print s最近经常遇到这样的问题:问题一
- python提取特定时间段内的数据尝试一下:data['Date'] = pd.to_datetime(data['
- 题目描述利用opencv或其他工具编写程序实现医学处理。实现过程# -*- coding: utf-8 -*-'''
- 首先要说明的是,这个标题有点标题党的意思,这个 bug 也存在于 IE8 下,在 IE6 和 IE7 下正常。之前写过两篇关于 I
- 这样处理的弊端是:如果数据量大,子分类很多,达到4级以上,这方法处理极端占用数据库连接池 对性能影响很大。 如果用SQL下面的CTE递归处理
- 表还是total_sales添加一项表:SQL语句:SELECT * from( SELECT a1.N
- 本文实例讲述了JavaScript实现的背景自动变色代码。分享给大家供大家参考,具体如下:这里演示JavaScript实现网页背景自动变色,