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 21 Python
python matplotlib 在指定的两个点之间连线方法
May 25 Python
详解django自定义中间件处理
Nov 21 Python
python读取目录下最新的文件夹方法
Dec 24 Python
python hbase读取数据发送kafka的方法
Dec 27 Python
python实现两张图片的像素融合
Feb 23 Python
python实现电子书翻页小程序
Jul 23 Python
基于python实现FTP文件上传与下载操作(ftp&sftp协议)
Apr 01 Python
如何写python的配置文件
Jun 07 Python
python属于跨平台语言码
Jun 09 Python
如何用 Python 制作一个迷宫游戏
Feb 25 Python
python自然语言处理之字典树知识总结
Apr 25 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
zf框架的Filter过滤器使用示例
2014/03/13 PHP
php有道翻译api调用方法实例
2014/12/22 PHP
PHP中将一个字符串部分字符用星号*替代隐藏的实现代码
2019/09/08 PHP
前端开发的开始---基于面向对象的Ajax类
2010/09/17 Javascript
js实现简单的星级选择器提交效果适用于评论等
2013/10/18 Javascript
js字符串转成JSON
2013/11/07 Javascript
js实现图片从左往右渐变切换效果的方法
2015/02/06 Javascript
javascript处理a标签超链接默认事件的方法
2015/06/29 Javascript
jQuery插件pagewalkthrough实现引导页效果
2015/07/05 Javascript
jQuery validate验证插件使用详解
2016/05/11 Javascript
JS简单随机数生成方法
2016/09/05 Javascript
Javascript 制作图形验证码实例详解
2016/12/22 Javascript
webpack实现一个行内样式px转vw的loader示例
2018/09/13 Javascript
JavaScript私有变量实例详解
2019/01/24 Javascript
Nuxt.js实战和配置详解
2019/08/05 Javascript
Echarts地图添加引导线效果(labelLine)
2019/09/30 Javascript
小程序接入腾讯位置服务的详细流程
2020/03/03 Javascript
jQuery实现的移动端图片缩放功能组件示例
2020/05/01 jQuery
[03:22]DAC最前线(第二期)—DOTA2亚洲邀请赛主赛场周边及线路探访
2015/01/24 DOTA
Python实现的基数排序算法原理与用法实例分析
2017/11/23 Python
Python多线程编程之多线程加锁操作示例
2018/09/06 Python
Python实现定时执行任务的三种方式简单示例
2019/03/30 Python
在python tkinter界面中添加按钮的实例
2020/03/04 Python
利用Python如何制作贪吃蛇及AI版贪吃蛇详解
2020/08/24 Python
英国最大线上综合鞋类商城:Office
2017/12/08 全球购物
WWE美国职业摔角官方商店:WWE Shop
2018/11/15 全球购物
英国购买威士忌网站:Master of Malt
2019/09/26 全球购物
优秀士兵先进事迹
2014/02/06 职场文书
人力资源主管职责范本
2014/03/05 职场文书
挂牌仪式主持词
2014/03/20 职场文书
青春雷锋观后感
2015/06/10 职场文书
2015高中教师个人工作总结
2015/07/21 职场文书
师德师风培训感言
2015/08/03 职场文书
2019行政前台转正申请书范文3篇
2019/08/15 职场文书
根德5570型九灯四波段立体声收音机是电子管收音机的楷模 ? 再论5570
2022/04/05 无线电
HTML页面点击按钮关闭页面的多种方式
2022/12/24 HTML / CSS