一、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语句的更多相关文章

  1. Python 为什么不支持 switch 语句?

    本文出自"Python为什么"系列,请查看全部文章 在这篇文章里,我们会聊一聊为什么 Python 决定不支持 switch 语句. 为什么想要聊这个话题呢? 主要是因为 swit ...

  2. C#与数据库访问技术总结(六)之Command对象创建SQl语句代码示例

    Command对象创建SQl语句代码示例 说明:前面介绍了 Command 对象的方法和一些属性,回顾一下 Command对象主要用来执行SQL语句.利用Command对象,可以查询数据和修改数据. ...

  3. python类与对象-如何让对象支持上下文管理

    如何让对象支持上下文管理 问题举例 一个telnet客户端的类TelnetClient, 调用实例的connect(),login(),interact方法 启动客户端与服务器交互,交互完毕后需要调用 ...

  4. statement 对象执行sql语句

    statement对象执行sql语句    关于Statement.它是Java执行数据库操作的一个重要步骤,可以执行一些简单的SQL语句,从而完成对数据库的操作.它有两个子接口,分别是Prepare ...

  5. Python学习笔记总结(一)对象和流程语句总结

    一.对象类型 1.数字 数字:不可变 2.字符串 字符串:不可原处修改[修改需要创建新的对象],有顺序,支持求长(len),合并(+),重复(*),索引S[0],分片(S[1:3]],成员测试(in) ...

  6. 如何用ORM支持SQL语句的CASE WHEN?

    OQL如何支持CASE WHEN? 今天,一个朋友问我,OQL可否支持CASE WHEN语句?他给的示例SQL如下: then '启用' else '停用' from tb_User OQL是SOD框 ...

  7. 反射生成 INSERT 多个对象的 SQL 语句(批量插入)

    + View code private static void insertObject(List<?> objectList) throws IllegalAccessException ...

  8. statement对象与sql语句(新手)

    本篇介绍读上篇代码中的疑惑点 实现简单网页上对数据内容进行增删改查,需要用到三个部分:jsp网页前端部分+java后台程序+数据库表 一.创建一个Statement (用于在已经建立数据库连接的基础上 ...

  9. JavaScript 练习,变量,数组,函数,对象, with for 语句

    JavaScript 基于对象 和 事件驱动!!! <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" ...

随机推荐

  1. Java知多少(70)面向字节流的应用

    文件输入输出流 文件输入输出流 FileInputStream 和 FileOutputStream 负责完成对本地磁盘文件的顺序输入输出操作. [例 10-5]通过程序创建一个文件,从键盘输入字符, ...

  2. altium designer 10如何画4层板

    本篇博客主要讲解一下如何用altium designer10去画4层板. 想想当初自己画4层板时,也去网上海找资料,结果是零零散散,也没讲出个123,于是硬着头皮去找师兄,如何画4层板.师兄冷笑道:“ ...

  3. IntellIJ IDEA 配置 Vue 支持

    IDEA版本: IntelliJ IDEA 2017.2Build #IU-172.3317.76, built on July 15, 2017Licensed to Administrator J ...

  4. HighCharts-highcharts resetZoom点击事件

    场景:zoom缩放功能: 选中x轴的一段区域后,需要解除x轴已设定的max值对zoom缩放功能的影响: 点击'reset zoom'后,又需要将max值重新赋值给x轴. 查遍highcharts ap ...

  5. [Android] 基于 Linux 命令行构建 Android 应用(六):Android 应用签名

    Android 要求所有应用在安装前必须使用证书进行数字签名.Android 使用该证书来确定一个应用以及其作者身份,该证书不要求由证书发行机构颁发,因此 Android 应用经常使用自我签名的证书, ...

  6. 【.NetCore学习】ubuntu16.04 搭建.net core mvc api 运行环境

    查看linux内核版本 uname -a 打印结果 python@ubuntu:~$ uname -a Linux ubuntu 4.4.0-31-generic #50-Ubuntu SMP Wed ...

  7. android基础---->XMl数据的解析

    在网络上传输数据时最常用的格式有两种,XML和JSON,下面首先学一下如何解析XML格式的数据,JSON的解析可以参见我的博客(android基础---->JSON数据的解析).解析XML 格式 ...

  8. linux sysfs文件系统

    个人理解:sysfs向用户空间展示了驱动设备的层次结构.我们都知道设备和对应的驱动都是由内核管理的,这些对于用户空间是不可见的.现在通过sysfs,可以在用户空间直观的了解设备驱动的层次结构. 我们来 ...

  9. nohup 同时实现记录日志和屏幕输出

    nohup   nohup命令:如果你正在运行一个进程,而且你觉得在退出帐户时该进程还不会结束,那么可以使用nohup命令.该命令可以在你退出帐户/关闭终端之后继续运行相应的进程.nohup就是不挂断 ...

  10. ABP之展现层(导航菜单)

    基本的增删改查已经粗糙的结束了,接下来就是要方便的展示了,也就是导航菜单.在Abp中已经对导航栏的设置进行了相应的封装(Abp.Application.Navigation),可以方便我们快速的将自己 ...