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内置函数之filter map reduce介绍
Nov 30 Python
python中requests模块的使用方法
Apr 08 Python
python读写二进制文件的方法
May 09 Python
Python cookbook(数据结构与算法)实现优先级队列的方法示例
Feb 18 Python
解决python写入带有中文的字符到文件错误的问题
Jan 31 Python
Python除法之传统除法、Floor除法及真除法实例详解
May 23 Python
python实现多进程通信实例分析
Sep 01 Python
Python 装饰器@,对函数进行功能扩展操作示例【开闭原则】
Oct 17 Python
Python列表切片常用操作实例解析
Dec 16 Python
Python logging自定义字段输出及打印颜色
Nov 30 Python
Python爬虫之Selenium多窗口切换的实现
Dec 04 Python
自动在Windows中运行Python脚本并定时触发功能实现
Sep 04 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 动态添加记录
2009/03/10 PHP
解析thinkphp中的导入文件标签
2013/06/20 PHP
ThinkPHP公共配置文件与各自项目中配置文件组合的方法
2014/11/24 PHP
PHP与Java对比学习日期时间函数
2016/07/03 PHP
php操作access数据库的方法详解
2017/02/22 PHP
PHP精确到毫秒秒杀倒计时实例详解
2019/03/14 PHP
PHP字符串中抽取子串操作实例分析
2019/06/22 PHP
php快速导入大量数据的实例方法
2019/09/23 PHP
基于jQuery的消息提示插件之旅 DivAlert(三)
2010/04/01 Javascript
asp.net 30分钟掌握无刷新 Repeater
2011/09/16 Javascript
javascript十六进制及二进制转化的方法
2015/05/06 Javascript
AngularJS实现用户登录状态判断的方法(Model添加拦截过滤器,路由增加限制)
2016/12/12 Javascript
浅谈对Angular中的生命周期钩子的理解
2017/07/31 Javascript
微信小程序实现随机验证码功能
2018/12/20 Javascript
JS判断数组是否包含某元素实现方法汇总
2020/06/24 Javascript
详解JavaScript 作用域
2020/07/14 Javascript
[34:44]Liquid vs TNC Supermajor 胜者组 BO3 第二场 6.4
2018/06/05 DOTA
[01:01:36]Optic vs paiN 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
Python聚类算法之基本K均值实例详解
2015/11/20 Python
mysql 之通过配置文件链接数据库
2017/08/12 Python
使用python读取txt文件的内容,并删除重复的行数方法
2018/04/18 Python
python学习开发mock接口
2019/04/28 Python
Python3环境安装Scrapy爬虫框架过程及常见错误
2019/07/12 Python
将python文件打包exe独立运行程序方法详解
2020/02/12 Python
Python MySQLdb 执行sql语句时的参数传递方式
2020/03/04 Python
python 抓取知乎指定回答下视频的方法
2020/07/09 Python
Python+Xlwings 删除Excel的行和列
2020/12/19 Python
25个CSS3动画按钮和菜单教程分享
2012/10/03 HTML / CSS
详解HTML5 Canvas绘制时指定颜色与透明度的方法
2016/03/25 HTML / CSS
Argos官网:英国家喻户晓的百货零售连锁商
2017/04/03 全球购物
毕业生自荐信
2013/12/14 职场文书
《画杨桃》教学反思
2014/04/13 职场文书
市场督导岗位职责
2015/04/10 职场文书
毕业实习单位意见
2015/06/04 职场文书
2016年“六一儿童节”校园广播稿
2015/12/17 职场文书
Ruby处理CSV数据方法详解
2022/04/18 Ruby