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机器学习logistic回归代码解析
Jan 17 Python
python 接口测试response返回数据对比的方法
Feb 11 Python
python中abs&map&reduce简介
Feb 20 Python
Python Numpy 数组的初始化和基本操作
Mar 13 Python
Python3实现购物车功能
Apr 18 Python
python绘制地震散点图
Jun 18 Python
Tensorflow 实现释放内存
Feb 03 Python
Pytorch maxpool的ceil_mode用法
Feb 18 Python
python实现打砖块游戏
Feb 25 Python
Python数据结构dict常用操作代码实例
Mar 12 Python
python中怎么表示空值
Jun 19 Python
Python利用Faiss库实现ANN近邻搜索的方法详解
Aug 03 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在线打包程序源码
2008/07/27 PHP
smarty内置函数{loteral}、{ldelim}和{rdelim}用法实例
2015/01/22 PHP
PHP实现求两个字符串最长公共子串的方法示例
2017/11/17 PHP
PHP实现微信小程序用户授权的工具类示例
2019/03/05 PHP
PHP实现提取多维数组指定一列的方法总结
2019/12/04 PHP
彪哥1.1(智能表格)提供下载
2006/09/07 Javascript
JQuery操作表格(隔行着色,高亮显示,筛选数据)
2012/02/23 Javascript
JS验证邮箱格式是否正确的代码
2013/12/05 Javascript
简单的ajax连接库分享(不用jquery的ajax)
2014/01/19 Javascript
JS将所有对象s的属性复制给对象r(原生js+jquery)
2014/01/25 Javascript
JavaSciprt中处理字符串之sup()方法的使用教程
2015/06/08 Javascript
JavaScript中反正弦函数Math.asin()的使用简介
2015/06/14 Javascript
javascript特殊文本输入框网页特效
2016/09/13 Javascript
ES6学习笔记之正则表达式和字符串正则方法分析
2017/04/25 Javascript
vue数组对象排序的实现代码
2018/06/20 Javascript
对vue事件的延迟执行实例讲解
2018/08/28 Javascript
vue+vue-router转场动画的实例代码
2018/09/01 Javascript
vue里input根据value改变背景色的实例
2018/09/29 Javascript
详解小程序开发经验:多页面数据同步
2019/05/18 Javascript
Vue使用NProgress进度条的方法
2019/09/21 Javascript
js实现3D照片墙效果
2019/10/28 Javascript
vue自定义switch开关组件,实现样式可自行更改
2019/11/01 Javascript
jQuery实现简单弹幕效果
2019/11/28 jQuery
Python使用ftplib实现简易FTP客户端的方法
2015/06/03 Python
Python用 KNN 进行验证码识别的实现方法
2018/02/06 Python
Python 中 function(#) (X)格式 和 (#)在Python3.*中的注意事项
2018/11/30 Python
Tkinter中复选菜单是否被选中的判断与设置方式
2020/03/04 Python
keras 获取某层输出 获取复用层的多次输出实例
2020/05/23 Python
在C中是否有模拟继承等面向对象程序设计特性的好方法
2012/05/22 面试题
个人求职简历的自我评价
2013/10/19 职场文书
小学教师国培感言
2014/02/08 职场文书
小学教学随笔感言
2014/02/26 职场文书
贷款工作证明模板
2015/06/12 职场文书
文明礼貌主题班会
2015/08/14 职场文书
nginx实现发布静态资源的方法
2021/03/31 Servers
游戏《我的世界》澄清Xbox版暂无计划加入光追
2022/04/03 其他游戏