python中with语句结合上下文管理器操作详解


Posted in Python onDecember 19, 2019

前言

所谓上下文管理器即在一个类中重写了__enter__方法和__exit__方法的类就可以成为上下文管理器类。

我们可以通过with语句结合上下文管理器简化一些操作。

使用with语句结合自定义上下文管理器完成数据库相应的操作,代码实现如下:

# 1. 导入模块
import pymysql

# 创建自定义上下文管理器对象
class MyDatabase(object):
 # 接收参数并创建数据库连接对象
 def __init__(self, host, port, user, passwd, database):
  self.__db = pymysql.Connection(host, port, user, passwd, database, charset='utf8')

 # 返回数据库连接对象
 def __enter__(self):
  return self.__db

 # 关闭数据库连接
 def __exit__(self, exc_type, exc_val, exc_tb):
  self.__db.close()


def main():
 # 使用with关键字接收enter返回的对象给db
 with MyDatabase('localhost', 3306, 'root', 'mysql', 'JDDB') as db:
  # 利用db创建游标
  cur = db.cursor()
  sql = '''select * from %s'''
  cur.execute(sql, (goods,))
  result = cur.fetchall()
  for i in result:
   print(i)
  # 关闭游标
  cur.close()

# 程序入口
if __name__ == '__main__':
 main()

上下文管理器类的代码流程:

1.编写__init__方法用来接收参数,并创建数据库连接对象;

2.重写__enter__方法,返回数据库连接对象;

3.重写__exit__方法,用来关闭数据库连接;

with语句代码流程:

1.当将创建对象的语句放到with语句里时不会创建对象,而是接受__enter__方法返回的对象并给对象起个别名;

2.使用接受到的对象即数据库连接对象,创建游标;

3.编写SQL语句,并通过游标执行SQL语句;

4.获取SQL语句的查询结果,并显示出来;

5.关闭游标;

6.当with语句内的代码执行完毕后自动执行__exit__方法关闭数据库连接。

注意:with MyDatabase() as db ---> db = MyDatabase().__enter__()

利用with结合自定义上下文类实现HTTP服务端:

# 1.导入socket模块
import socket


class MySocket(object):
 # 2.编写init方法接收port参数
 def __init__(self, port):
  self.__port = port
  # 3.创建socket对象
  self.__sk = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

 # 4.编写enter方法返回套接字对象
 def __enter__(self):
  # 设置端口复用
  self.__sk.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
  # 绑定端口
  self.__sk.bind(self.__port)
  # 设置端口监听
  self.__sk.listen(128)
  # 返回套接字对象
  return self.__sk

 # 5.编写exit方法关闭套接字对象
 def __exit__(self, exc_type, exc_val, exc_tb):
  self.__sk.close()


def main():
 # 使用with关键字 并接受返回的套接字对象给sk
 with MySocket(8000) as sk:
  # 等待客户端连接
  clicent, ip_port = sk.accept()
  recv_data = clicent.recv(1024)
  print(recv_data.decode('utf-8'))
  # 编写HTTP响应报文
  http_line = 'HTTP/1.1 GET 200 OK\r\n'
  http_header = 'Server PWS/1.0\r\n'
  http_body = 'Welcome to index!\r\n'
  send_data = (http_line + http_header + '\r\n' + http_body).encode('utf-8')
  clicent.send(send_data)
  # 关闭客户端连接
  clicent.close()

# 编写程序入口
if __name__ == '__main__':
 main()

自定义上下文管理器类的代码解读:

1.编写__init__方法,用来接收参数并创建套接字对象;

2.编写__enter__方法,并使用套接字对象设置端口复用、绑定端口、并设置监听,然后返回套接字对象;

3.编写__exit__方法,关闭套接字对象。

with语句代码解读:

1.接收enter返回的套接字对象,并起个别名,

2.通过返回套接字对象等待客户端连接,

3.接收客户端连接成功后会返回一个新的套接字和IP端口号,

4.使用客户端套接字发送HTTP响应报文

5.关闭客户端连接

6.当with语句中的代码执行完毕后自动执行__exit__方法,关闭服务器连接

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对三水点靠木的支持。

Python 相关文章推荐
Python中比较特别的除法运算和幂运算介绍
Apr 05 Python
python实现的守护进程(Daemon)用法实例
Jun 02 Python
Python DataFrame 设置输出不显示index(索引)值的方法
Jun 07 Python
如何基于python测量代码运行时间
Dec 25 Python
python实现的分层随机抽样案例
Feb 25 Python
windows支持哪个版本的python
Jul 03 Python
linux centos 7.x 安装 python3.x 替换 python2.x的过程解析
Dec 14 Python
Python如何telnet到网络设备
Feb 18 Python
用Python提取PDF表格的方法
Apr 11 Python
详解Python类和对象内容
Jun 22 Python
Python集合set()使用的方法详解
Mar 18 Python
python读取并查看npz/npy文件数据以及数据显示方法
Apr 14 Python
Django中密码的加密、验密、解密操作
Dec 19 #Python
利用OpenCV和Python实现查找图片差异
Dec 19 #Python
Python文本处理简单易懂方法解析
Dec 19 #Python
python类中super() 的使用解析
Dec 19 #Python
在python中计算ssim的方法(与Matlab结果一致)
Dec 19 #Python
用openCV和Python 实现图片对比,并标识出不同点的方式
Dec 19 #Python
Python命令行click参数用法解析
Dec 19 #Python
You might like
PHP制作图型计数器的例子
2006/10/09 PHP
PHP VS ASP
2006/10/09 PHP
ThinkPHP3.1新特性之命名范围的使用
2014/06/19 PHP
php上传文件并存储到mysql数据库的方法
2015/03/16 PHP
PHP基于双向链表与排序操作实现的会员排名功能示例
2017/12/26 PHP
PHP获取数据库表中的数据插入新的表再原删除数据方法
2018/10/12 PHP
如何优雅的使用 laravel 的 validator验证方法
2018/11/11 PHP
thinkPHP5框架路由常用知识点汇总
2019/09/15 PHP
JQuery扩展插件Validate 5添加自定义验证方法
2011/09/05 Javascript
jQuery对象数据缓存Cache原理及jQuery.data方法区别介绍
2013/04/07 Javascript
Jquery带搜索框的下拉菜单
2013/05/06 Javascript
jquery 合并内容相同的单元格(示例代码)
2013/12/13 Javascript
SeaJS 与 RequireJS 的差异对比
2014/12/08 Javascript
JavaScript实现网站访问次数统计代码
2015/08/12 Javascript
简单的jQuery banner图片轮播实例代码
2016/03/04 Javascript
JavaScript接口的实现三种方式(推荐)
2016/06/14 Javascript
Bootstrap模态框(modal)垂直居中的实例代码
2016/08/18 Javascript
详解JS中遍历语法的比较
2017/04/07 Javascript
JS实现unicode和UTF-8之间的互相转换互转
2017/07/05 Javascript
Vue实例中生命周期created和mounted的区别详解
2017/08/25 Javascript
对于Javascript 执行上下文的全面了解
2017/09/05 Javascript
layui radio性别单选框赋值方法
2018/08/15 Javascript
vue解决一个方法同时发送多个请求的问题
2018/09/25 Javascript
[01:07:21]NAVI vs VG Supermajor 败者组 BO3 第二场 6.5
2018/06/06 DOTA
python使用arcpy.mapping模块批量出图
2017/03/06 Python
Python利用multiprocessing实现最简单的分布式作业调度系统实例
2017/11/14 Python
Python机器学习算法之k均值聚类(k-means)
2018/02/23 Python
python实现拼图小游戏
2020/02/22 Python
python中re模块知识点总结
2021/01/17 Python
详解CSS3弹性伸缩盒
2020/09/21 HTML / CSS
入职担保书怎么写
2014/05/12 职场文书
2014离婚协议书范文两篇
2014/09/15 职场文书
2014最新实习证明模板
2014/10/02 职场文书
开业典礼致辞
2015/07/29 职场文书
python 爬取华为应用市场评论
2021/05/29 Python
浅谈如何保证Mysql主从一致
2022/03/13 MySQL