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的Flask框架的简介和安装方法
Nov 13 Python
python2.7到3.x迁移指南
Feb 01 Python
深入理解Python异常处理的哲学
Feb 01 Python
超简单使用Python换脸实例
Mar 27 Python
Python对HTML转义字符进行反转义的实现方法
Apr 28 Python
Python-jenkins 获取job构建信息方式
May 12 Python
python3 re返回形式总结
Nov 20 Python
python使用smtplib模块发送邮件
Dec 17 Python
Python数据可视化之绘制柱状图和条形图
May 25 Python
python pygame入门教程
Jun 01 Python
python 实现两个变量值进行交换的n种操作
Jun 02 Python
opencv用VS2013调试时用Image Watch插件查看图片
Jul 26 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操作xml入门之xml标签的属性分析
2015/01/23 PHP
php+jQuery递归调用POST循环请求示例
2016/10/14 PHP
PHP实现mysqli批量执行多条语句的方法示例
2017/07/22 PHP
数理公式,也可以这么唯美
2021/03/10 无线电
一些易混淆且不常用的属性,希望有用
2007/01/29 Javascript
js获取提交的字符串的字节数
2009/02/09 Javascript
扩展javascript的Date方法实现代码(prototype)
2010/11/20 Javascript
Extjs4实现两个GridPanel之间数据拖拽功能具体方法
2013/11/21 Javascript
javascript实现相同事件名称,不同命名空间的调用方法
2015/06/26 Javascript
详解JavaScript函数对象
2015/11/15 Javascript
全面解析多种Bootstrap图片轮播效果
2016/05/27 Javascript
基于Jquery Ajax type的4种类型(详解)
2017/08/02 jQuery
webpack-dev-server自动更新页面方法
2018/02/22 Javascript
Angular6 Filter实现页面搜索的示例代码
2018/12/02 Javascript
JavaScript基于数组实现的栈与队列操作示例
2018/12/22 Javascript
vue-router命名视图的使用讲解
2019/01/19 Javascript
JS实现网页端猜数字小游戏
2020/03/06 Javascript
Vue向后台传数组数据,springboot接收vue传的数组数据实例
2020/11/12 Javascript
[03:05]DOTA2英雄基础教程 嗜血狂魔
2013/12/10 DOTA
[04:03]DOTA2英雄梦之声_第02期_风暴之灵
2014/06/30 DOTA
[58:23]LGD vs TNC 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/16 DOTA
Python易忽视知识点小结
2015/05/25 Python
python实现黑客字幕雨效果
2018/06/21 Python
python 多线程对post请求服务器测试并发的方法
2019/06/13 Python
对django views中 request, response的常用操作详解
2019/07/17 Python
Python中断多重循环的思路总结
2019/10/04 Python
python实现scrapy爬虫每天定时抓取数据的示例代码
2021/01/27 Python
移动端适配 使px自动转换rem
2019/08/26 HTML / CSS
天逸系统(武汉)有限公司Java笔试题
2015/12/29 面试题
会计电算化毕业生自荐信
2014/03/03 职场文书
工业自动化专业自荐信范文
2014/04/10 职场文书
社区娱乐活动方案
2014/08/21 职场文书
认错检讨书
2014/10/02 职场文书
交通事故赔偿协议书怎么写
2014/10/04 职场文书
个人总结格式范文
2015/03/09 职场文书
五年级语文教学反思
2016/03/03 职场文书