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中处理日期和时间的基本知识点整理汇总
May 22 Python
Python函数式编程指南(三):迭代器详解
Jun 24 Python
python中reload(module)的用法示例详解
Sep 15 Python
python 统计数组中元素出现次数并进行排序的实例
Jul 02 Python
Python2 Selenium元素定位的实现(8种)
Feb 25 Python
Pyqt QImage 与 np array 转换方法
Jun 27 Python
python中pip的使用和修改下载源的方法
Jul 08 Python
python+tkinter实现学生管理系统
Aug 20 Python
Python time库基本使用方法分析
Dec 13 Python
python中strip(),lstrip(),rstrip()函数的使用讲解
Nov 17 Python
Django中日期时间型字段进行年月日时分秒分组统计
Nov 27 Python
Python中OpenCV实现简单车牌字符切割
Jun 11 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+MYSQL的文章管理系统(一)
2006/10/09 PHP
PHP 获取文件路径(灵活应用__FILE__)
2013/02/15 PHP
php curl选项列表(超详细)
2013/07/01 PHP
PHP中获取时间的下一周下个月的方法
2014/03/18 PHP
php集成环境xampp中apache无法启动问题解决方案
2014/11/18 PHP
php数组键值用法实例分析
2015/02/27 PHP
php冒泡排序与快速排序实例详解
2015/12/07 PHP
php getcwd与dirname(__FILE__)区别详解
2016/09/24 PHP
js、css、img等浏览器缓存问题的2种解决方案
2013/10/23 Javascript
js 动态修改css文件用到了cssRule
2014/08/20 Javascript
简单谈谈javascript中的变量、作用域和内存问题
2015/08/30 Javascript
jQuery进行组件开发完整实例
2015/12/15 Javascript
分享12个实用的jQuery代码片段
2016/03/09 Javascript
JS实现控制文本框的内容
2016/07/10 Javascript
node+experss实现爬取电影天堂爬虫
2016/11/20 Javascript
自己封装的一个原生JS拖动方法(推荐)
2016/11/22 Javascript
AngularJS之自定义服务详解(factory、service、provider)
2017/04/14 Javascript
React+react-dropzone+node.js实现图片上传的示例代码
2017/08/23 Javascript
解决vue中修改了数据但视图无法更新的情况
2018/08/27 Javascript
Vue组件教程之Toast(Vue.extend 方式)详解
2019/01/27 Javascript
javascript删除数组元素的七个方法示例
2019/09/09 Javascript
vue下axios拦截器token刷新机制的实例代码
2020/01/17 Javascript
js实现碰撞检测
2021/01/29 Javascript
Python实现简单登录验证
2016/04/13 Python
python中pylint使用方法(pylint代码检查)
2018/04/06 Python
Linux下python制作名片示例
2018/07/20 Python
Python Django的安装配置教程图文详解
2019/07/17 Python
numpy数组做图片拼接的实现(concatenate、vstack、hstack)
2019/11/08 Python
使用PyWeChatSpy自动回复微信拍一拍功能的实现代码
2020/07/02 Python
如何使用python自带IDLE的几种方法
2020/10/10 Python
2014年巴西世界杯口号
2014/06/05 职场文书
土木工程专业本科生求职信
2014/10/01 职场文书
2016年感恩教师节校园广播稿
2015/12/18 职场文书
机关单位2016年法制宣传日活动总结
2016/04/01 职场文书
Java Shutdown Hook场景使用及源码分析
2021/06/15 Java/Android
mysql 子查询的使用
2022/04/28 MySQL