让对象支持with语句

一、with语句的好处
with语句的好处在于,它可以自动帮我们释放上下文,就比如文件句柄的操作,
如果你不使用with语句操作,你要先open一个文件句柄,使用完毕后要close这个文件句柄,
而使用with语句后,退出with代码块的时候就会自动帮你释放掉这个文件句柄。
场景使用:
网络连接、数据库连接、文件句柄、锁 二、如何让对象支持with语句
方法:
在创建类的时候,在内部实现__enter__方法,with语句一开始就会执行这个方法,
再实现__exit__方法,退出with代码块的时候会自动执行这个方法。 例子:
class A:
def __enter__(self):
print('with语句开始')
return self # 返回self就是把这个对象赋值给as后面的变量 def __exit__(self, exc_type, exc_val, exc_tb):
print('with语句结束') with A() as f:
print('IG牛批')
print(f)
print('IG真的牛批') 结果:
with语句开始
IG牛批
<__main__.A object at 0x0000027B4D1596D8>
with语句结束
IG真的牛批 三、使用with语句优化pymysql的操作
1、使用with语句连接pymysql数据库基本操作
import pymysql class SQLManager(object):
# 初始化实例的时候调用connect方法连接数据库
def __init__(self):
self.conn = None
self.cursor = None
self.connect() # 连接数据库
def connect(self):
self.conn = pymysql.connect(
host='127.0.0.1',
port=3306,
database='mydb',
user='root',
password='123abc',
charset='utf8'
)
self.cursor = self.conn.cursor(cursor=pymysql.cursors.DictCursor) # 关闭数据库
def close(self):
self.cursor.close()
self.conn.close() # 进入with语句自动执行
def __enter__(self):
return self # 退出with语句自动执行
def __exit__(self, exc_type, exc_val, exc_tb):
self.close() 2、还可以在上面的基础上实现pymysql的一些操作
class SQLManager(object): # 初始化实例方法
def __init__(self):
self.conn = None
self.cursor = None
self.connect() # 连接数据库
def connect(self):
self.conn = pymysql.connect(
host='127.0.0.1',
port=3306,
database='mydb',
user='root',
password='123abc',
charset='utf8'
)
self.cursor = self.conn.cursor(cursor=pymysql.cursors.DictCursor) # 查询多条数据sql是sql语句,args是sql语句的参数
def get_list(self, sql, args=None):
self.cursor.execute(sql, args)
result = self.cursor.fetchall()
return result # 查询单条数据
def get_one(self, sql, args=None):
self.cursor.execute(sql, args)
result = self.cursor.fetchone()
return result # 执行单条SQL语句
def moddify(self, sql, args=None):
self.cursor.execute(sql, args)
self.conn.commit() # 执行多条SQL语句
def multi_modify(self, sql, args=None):
self.cursor.executemany(sql, args)
self.conn.commit() # 创建单条记录的语句
def create(self, sql, args=None):
self.cursor.execute(sql, args)
self.conn.commit()
last_id = self.cursor.lastrowid
return last_id # 关闭数据库cursor和连接
def close(self):
self.cursor.close()
self.conn.close() # 进入with语句自动执行
def __enter__(self):
return self # 退出with语句块自动执行
def __exit__(self, exc_type, exc_val, exc_tb):
self.close()

让对象支持with语句的更多相关文章
- Python 为什么不支持 switch 语句?
本文出自"Python为什么"系列,请查看全部文章 在这篇文章里,我们会聊一聊为什么 Python 决定不支持 switch 语句. 为什么想要聊这个话题呢? 主要是因为 swit ...
- C#与数据库访问技术总结(六)之Command对象创建SQl语句代码示例
Command对象创建SQl语句代码示例 说明:前面介绍了 Command 对象的方法和一些属性,回顾一下 Command对象主要用来执行SQL语句.利用Command对象,可以查询数据和修改数据. ...
- python类与对象-如何让对象支持上下文管理
如何让对象支持上下文管理 问题举例 一个telnet客户端的类TelnetClient, 调用实例的connect(),login(),interact方法 启动客户端与服务器交互,交互完毕后需要调用 ...
- statement 对象执行sql语句
statement对象执行sql语句 关于Statement.它是Java执行数据库操作的一个重要步骤,可以执行一些简单的SQL语句,从而完成对数据库的操作.它有两个子接口,分别是Prepare ...
- Python学习笔记总结(一)对象和流程语句总结
一.对象类型 1.数字 数字:不可变 2.字符串 字符串:不可原处修改[修改需要创建新的对象],有顺序,支持求长(len),合并(+),重复(*),索引S[0],分片(S[1:3]],成员测试(in) ...
- 如何用ORM支持SQL语句的CASE WHEN?
OQL如何支持CASE WHEN? 今天,一个朋友问我,OQL可否支持CASE WHEN语句?他给的示例SQL如下: then '启用' else '停用' from tb_User OQL是SOD框 ...
- 反射生成 INSERT 多个对象的 SQL 语句(批量插入)
+ View code private static void insertObject(List<?> objectList) throws IllegalAccessException ...
- statement对象与sql语句(新手)
本篇介绍读上篇代码中的疑惑点 实现简单网页上对数据内容进行增删改查,需要用到三个部分:jsp网页前端部分+java后台程序+数据库表 一.创建一个Statement (用于在已经建立数据库连接的基础上 ...
- JavaScript 练习,变量,数组,函数,对象, with for 语句
JavaScript 基于对象 和 事件驱动!!! <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" ...
随机推荐
- 【css】css 中文字体 unicode 对照表
css 中文字体可以用 unicode 格式来表示,比如“宋体”可以用 \5B8B\4F53 来表示.具体参考下表: 中文名 英文名 unicode 宋体 SimSun \5B8B\4F53 黑体 S ...
- WPF 4.5 is here : check out the new features !
So what's New in WPF Version 4.5 Developer Preview ? Here is a list of the new features and their re ...
- laravel数据库配置
1.说明,查看laravel数据库配置 项目名/config/database.php 'default' => env('DB_CONNECTION', 'mysql') 2.数据开发 ...
- java指纹识别+谷歌图片识别技术_源代码
主类: import java.awt.image.BufferedImage; import java.util.ArrayList; import java.util.List; public c ...
- java程序员必须要学会的linux命令总结
1.查找文件find / -name filename.txt 根据名称查找/目录下的filename.txt文件.find . -name “*.xml” 递归查找所有的xml文件2.查看一个程序是 ...
- 解决在antd中使用 autoprefixer 9.4.5 会抛出错误 Replace text-decoration-skip: ink to text-decoration-skip-ink: auto, because spec had been changed 的问题
其实这个和antd的版本有关系,只需要把antd的版本升级到3.12.4就可以了 yarn add antd@ --save 记得重新运行一下项目
- iOS(UIWebView 和WKWebView)OC与JS交互 之二
在iOS应用的开发过程中,我们经常会使用到WebView,当我们对WebView进行操作的时候,有时会需要进行源生的操作.那么我记下来就与大家分享一下OC与JS交互. 首先先说第一种方法,并没有牵扯O ...
- 【netcore基础】MVC API全局异常捕捉中间件ExceptionHandlerMiddleWare
项目中想通过统一的接口格式返回异常信息,而不是404 500等HTTP协议层的异常响应 例如 { , , "message":"用户名或密码不正确", &quo ...
- 使用Curator操作ZooKeeper
Curator是Netflix公司开源的一个ZooKeeper client library,用于简化ZooKeeper客户端编程.它包含如下模块: Framework:Framework是ZooKe ...
- C++文件流操作
#include <iostream> #include <fstream> #include<iostream> using namespace std; int ...