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中set使用
Jun 30 Python
Python文件监听工具pyinotify与watchdog实例
Oct 15 Python
Python3中在Anaconda环境下安装basemap包
Oct 21 Python
python实现将多个文件分配到多个文件夹的方法
Jan 07 Python
python基于Selenium的web自动化框架
Jul 14 Python
使用TensorFlow实现简单线性回归模型
Jul 19 Python
Pytorch在dataloader类中设置shuffle的随机数种子方式
Jan 14 Python
tensorflow 保存模型和取出中间权重例子
Jan 24 Python
Python3如何使用多线程升程序运行速度
Aug 11 Python
Python在后台自动解压各种压缩文件的实现方法
Nov 10 Python
python中time包实例详解
Feb 02 Python
python执行js代码的方法
May 13 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
删除无限级目录与文件代码共享
2006/07/12 PHP
php 生成静态页面的办法与实现代码详细版
2010/02/15 PHP
PHP中生成UUID自定义函数分享
2015/06/10 PHP
PHP文件生成的图片无法使用CDN缓存的解决方法
2015/06/20 PHP
PHP xpath提取网页数据内容代码解析
2020/07/16 PHP
csdn 博客中实现运行代码功能实现
2009/08/29 Javascript
window.navigate 与 window.location.href 的使用区别介绍
2013/09/21 Javascript
利用浏览器全屏api实现js全屏
2014/01/16 Javascript
jQuery 如何先创建、再修改、后添加DOM元素
2014/05/20 Javascript
JavaScript获取当前网页标题(title)的方法
2015/04/03 Javascript
跨域请求的完美解决方法(JSONP, CORS)
2016/06/12 Javascript
AngularJs 指令详解及示例代码
2016/09/01 Javascript
3种不同的ContextMenu右键菜单实现代码
2016/11/03 Javascript
IE8兼容Jquery.validate.js的问题
2016/12/01 Javascript
Servlet实现文件上传,可多文件上传示例
2016/12/05 Javascript
bootstrap导航、选项卡实现代码
2016/12/28 Javascript
js 函数式编程学习笔记
2017/03/25 Javascript
通过js控制时间,一秒一秒自己动的实例
2017/10/25 Javascript
jQuery实现动态控制页面元素的方法分析
2017/12/20 jQuery
vue2.0 自定义 饼状图 (Echarts)组件的方法
2018/03/02 Javascript
vue2.0父子组件间传递数据的方法
2018/08/16 Javascript
python脚本爬取字体文件的实现方法
2017/04/29 Python
深入flask之异步非堵塞实现代码示例
2018/07/31 Python
python实现统计文本中单词出现的频率详解
2019/05/20 Python
Python tkinter常用操作代码实例
2020/01/03 Python
python与mysql数据库交互的实现
2020/01/06 Python
Python实现i人事自动打卡的示例代码
2020/01/09 Python
一款基于css3麻将筛子3D翻转特效的实例教程
2014/12/31 HTML / CSS
美国复古街头服饰精品店:Need Supply Co.
2017/02/22 全球购物
商得四方公司面试题(gid+)
2014/04/30 面试题
营业员个人总结的自我评价
2013/10/25 职场文书
禁毒宣传活动总结
2014/08/26 职场文书
争做文明公民倡议书
2014/08/29 职场文书
2014年四风问题自我剖析材料
2014/09/15 职场文书
八年级上册语文教学计划
2015/01/22 职场文书
Java中try catch处理异常示例
2021/12/06 Java/Android