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使用matplotlib绘图无法显示中文问题的解决方法
Mar 14 Python
python基础教程项目五之虚拟茶话会
Apr 02 Python
Python数据结构之图的应用示例
May 11 Python
浅谈flask源码之请求过程
Jul 26 Python
python并发爬虫实用工具tomorrow实用解析
Sep 25 Python
解决TensorFlow训练内存不断增长,进程被杀死问题
Feb 05 Python
基于python 将列表作为参数传入函数时的测试与理解
Jun 05 Python
python如何保存文本文件
Jun 07 Python
DataFrame.groupby()所见的各种用法详解
Jun 14 Python
使用OpenCV去除面积较小的连通域
Jul 05 Python
Pycharm及python安装详细教程(图解)
Jul 31 Python
python使用selenium爬虫知乎的方法示例
Oct 28 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和ACCESS写聊天室(一)
2006/10/09 PHP
深入理解Yii2.0乐观锁与悲观锁的原理与使用
2017/07/26 PHP
PHP大文件分割上传 PHP分片上传
2017/08/28 PHP
javascript中String类的subString()方法和slice()方法
2011/05/24 Javascript
js函数模拟显示桌面.scf程序示例
2014/04/20 Javascript
JS判断变量是否为空判断是否null
2014/07/25 Javascript
jquery实现平滑的二级下拉菜单效果
2015/08/26 Javascript
js获取页面引用的css样式表中的属性值方法(推荐)
2016/08/19 Javascript
JS中作用域和变量提升(hoisting)的深入理解
2016/10/31 Javascript
Bootstrap popover用法详解
2016/12/22 Javascript
jQuery电话号码验证实例
2017/01/05 Javascript
JS 组件系列之 bootstrap treegrid 组件封装过程
2017/04/28 Javascript
微信小程序动态添加分享数据
2017/06/14 Javascript
Vue.JS实现垂直方向展开、收缩不定高度模块的JS组件
2018/06/19 Javascript
vue2.0 + ele的循环表单及验证字段方法
2018/09/18 Javascript
JavaScript 格式化数字、金额、千分位、保留几位小数、舍入舍去
2019/07/23 Javascript
javascript设计模式 ? 命令模式原理与用法实例分析
2020/04/20 Javascript
Vue filter 过滤器、以及在table中的使用介绍
2020/09/07 Javascript
antd Form组件方法getFieldsValue获取自定义组件的值操作
2020/10/29 Javascript
Python实现屏幕截图的代码及函数详解
2016/10/01 Python
python简单线程和协程学习心得(分享)
2017/06/14 Python
python爬虫获取淘宝天猫商品详细参数
2020/06/23 Python
Pyqt5 基本界面组件之inputDialog的使用
2019/06/25 Python
PyQt5连接MySQL及QMYSQL driver not loaded错误解决
2020/04/29 Python
在keras 中获取张量 tensor 的维度大小实例
2020/06/10 Python
python实现感知机模型的示例
2020/09/30 Python
python实现KNN近邻算法
2020/12/30 Python
HTML5的新特性(1)
2016/03/03 HTML / CSS
俄罗斯最大的隐形眼镜销售网站:Ochkov.Net
2021/02/07 全球购物
应届生骨科医生求职信
2013/10/31 职场文书
查摆问题整改措施
2014/10/24 职场文书
语文教师个人工作总结
2015/02/06 职场文书
高一化学教学反思
2016/02/22 职场文书
《蜜蜂引路》教学反思
2016/02/22 职场文书
Kubernetes控制节点的部署
2022/04/01 Servers