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 相关文章推荐
在Django的模型中添加自定义方法的示例
Jul 21 Python
python制作爬虫爬取京东商品评论教程
Dec 16 Python
Python内建函数之raw_input()与input()代码解析
Oct 26 Python
Python3使用pandas模块读写excel操作示例
Jul 03 Python
python的中异常处理机制
Aug 30 Python
Python中list循环遍历删除数据的正确方法
Sep 02 Python
Python3 集合set入门基础
Feb 10 Python
Python使用sqlite3模块内置数据库
May 07 Python
Python数据可视化实现多种图例代码详解
Jul 14 Python
python使用matplotlib绘制折线图的示例代码
Sep 22 Python
python 牛顿法实现逻辑回归(Logistic Regression)
Oct 15 Python
Anaconda配置各版本Pytorch的实现
Aug 07 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编程语言开发动态WAP页面
2006/10/09 PHP
基于jquery的高性能td和input切换并可修改内容实现代码
2011/01/09 Javascript
javascript代码加载优化方法
2011/01/30 Javascript
javascript 节点排序 2
2011/01/31 Javascript
JavaScript之编码规范 推荐
2012/05/23 Javascript
关于jquery input textare 事件绑定及用法学习
2013/04/03 Javascript
页面实时更新时间的JS实例代码
2013/12/18 Javascript
jquery统计输入文字的个数并对其进行判断
2014/01/07 Javascript
js获取客户端网卡的IP地址、MAC地址
2014/03/26 Javascript
Jquery实现动态切换图片的方法
2015/05/18 Javascript
JavaScript简单实现弹出拖拽窗口(二)
2016/06/17 Javascript
实例详解jQuery的无new构建
2016/08/02 Javascript
jQuery操作css样式
2017/05/15 jQuery
轻松学习JavaScript函数中的 Rest 参数
2019/05/30 Javascript
小试小程序云开发(小结)
2019/06/06 Javascript
微信小程序后端无法保持session的原因及解决办法问题
2020/03/20 Javascript
[00:09]DOTA2全国高校联赛 精彩活动引爆全场
2018/05/30 DOTA
python实现在目录中查找指定文件的方法
2014/11/11 Python
Python数据类型详解(三)元祖:tuple
2016/05/08 Python
Python实现PS滤镜特效Marble Filter玻璃条纹扭曲效果示例
2018/01/29 Python
Python 线程池用法简单示例
2019/10/02 Python
Python 格式化打印json数据方法(展开状态)
2020/02/27 Python
Python统计学一数据的概括性度量详解
2020/03/03 Python
基于python实现FTP文件上传与下载操作(ftp&sftp协议)
2020/04/01 Python
在pycharm中使用matplotlib.pyplot 绘图时报错的解决
2020/06/01 Python
基于Python实现体育彩票选号器功能代码实例
2020/09/16 Python
详解KMP算法以及python如何实现
2020/09/18 Python
a标签下载链接的简单实现
2016/09/13 HTML / CSS
Laura Mercier官网:彩妆大师罗拉玛斯亚的化妆品牌
2018/01/04 全球购物
澳大利亚领先的亚麻品牌:Bed Threads
2019/12/16 全球购物
PHP如何调用MYSQL存储过程
2014/05/30 面试题
舞蹈专业大学生职业规划范文
2014/03/12 职场文书
《一个小村庄的故事》教学反思
2014/04/13 职场文书
售后服务承诺书模板
2014/05/21 职场文书
创先争优一句话承诺
2014/05/29 职场文书
奥巴马开学演讲观后感
2015/06/12 职场文书