python类与对象-如何让对象支持上下文管理
如何让对象支持上下文管理
问题举例
一个telnet客户端的类TelnetClient, 调用实例的connect(),login(),interact方法
启动客户端与服务器交互,交互完毕后需要调用cleanup()方法,关闭已连接的socket,
以及将操作历史记录写入文件并关闭。
能否让TelnetClient的实例支持上下文管理协议,从而代替手工调用connect(),cleanup()方法。
解决思路
实现上下文管理协议,即实现类的__enter__, __exit__方法,
它们分别在with开始和结束时被调用。
代码
说明:这段代码并不能直接运行不了,因为服务器ip连接不上,
这里大家感受下大致实现思路即可即可
- from sys import stdin, stdout
- import getpass
- import telnetlib
- from collections import deque
- class TelnetClient:
- def __init__(self, host, port=23):
- self.host = host
- self.port = port
- def __enter__(self):
- self.tn = telnetlib.Telnet(self.host, self.port)
- self.history = deque([])
- return self
- def __exit__(self, exc_type, exc_value, exc_tb):
- print('IN __exit__', exc_type, exc_value, exc_tb)
- self.tn.close()
- self.tn = None
- with open('history.txt', 'a') as f:
- f.writelines(self.history)
- return True
- def login(self):
- # user
- self.tn.read_until(b"login: ")
- user = input("Enter your remote account: ")
- self.tn.write(user.encode('utf8') + b"\n")
- # password
- self.tn.read_until(b"Password: ")
- password = getpass.getpass()
- self.tn.write(password.encode('utf8') + b"\n")
- out = self.tn.read_until(b'$ ')
- stdout.write(out.decode('utf8'))
- def interact(self):
- while True:
- cmd = stdin.readline()
- if not cmd:
- break
- self.history.append(cmd)
- self.tn.write(cmd.encode('utf8'))
- out = self.tn.read_until(b'$ ').decode('utf8')
- stdout.write(out[len(cmd)+1:])
- stdout.flush()
- # client = TelnetClient('192.168.0.105')
- # client.connect()
- # client.login()
- # client.interact()
- # client.cleanup()
- with TelnetClient('192.168.0.105') as client:
- raise Exception('TEST')
- client.login()
- client.interact()
- print('END')
__exit__中返回True是为了压制异常向上抛
参考资料:python3实用编程技巧进阶
python类与对象-如何让对象支持上下文管理的更多相关文章
- 比较python类的两个instance(对象) 是否相等
http://www.yihaomen.com/article/python/281.htm 比较python类的两个instance(对象) 是否相等 作者:轻舞肥羊 日期:2012-10-25 字 ...
- Python核心技术与实战——二一|巧用上下文管理器和with语句精简代码
我们在Python中对于with的语句应该是不陌生的,特别是在文件的输入输出操作中,那在具体的使用过程中,是有什么引伸的含义呢?与之密切相关的上下文管理器(context manager)又是什么呢? ...
- python面向对象的多态-类相关内置函数-类内置魔法函数-迭代器协议-上下文管理-04
多态 一种事物具备不同的形态 例如:水 --> 固态.液态.气态 多态:# 多个不同对象可以相应同一个对象,产生不同的结果 首先强调,多态不是一种特殊的语法,而是一种状态,特性(多个不同对象可以 ...
- Python高级笔记(八)with、上下文管理器
1. 上下文管理器 __enter__()方法返回资源对象,__exit__()方法处理一些清除资源 如:系统资源:文件.数据库链接.Socket等这些资源执行完业务逻辑之后,必须要关闭资源 #!/u ...
- 【Python】 上下文管理器和contextlib
上下文管理器 一直对python中的上下文管理比较迷惑,趁着今天研究SQLAlchemy顺便看了一下,感觉稍微清楚了一点.http://www.cnblogs.com/chenny7/p/421344 ...
- python with语句上下文管理的两种实现方法
在编程中会经常碰到这种情况:有一个特殊的语句块,在执行这个语句块之前需要先执行一些准备动作:当语句块执行完成后,需要继续执行一些收尾动作.例如,文件读写后需要关闭,数据库读写完毕需要关闭连接,资源的加 ...
- python学习笔记4(对象/引用;多范式; 上下文管理器)
### Python的强大很大一部分原因在于,它提供有很多已经写好的,可以现成用的对象 21. 动态类型:对象/引用 对象和引用: 对象是储存在内存中的实体,对象名只是指向这一对象的引用(refere ...
- 翻译《Writing Idiomatic Python》(五):类、上下文管理器、生成器
原书参考:http://www.jeffknupp.com/blog/2012/10/04/writing-idiomatic-python/ 上一篇:翻译<Writing Idiomatic ...
- 走进 Python 类的内部
这篇文章和大家一起聊一聊 Python 3.8 中类和对象背后的一些概念和实现原理,主要尝试解释 Python 类和对象属性的存储,函数和方法,描述器,对象内存占用的优化支持,以及继承与属性查找等相关 ...
随机推荐
- Redis在CentOS和Windows安装过程
redis是一种key-value高效的内存数据库. key-value是什么?json懂吧?字典懂吧?这些都是key-value结构的数据,每个key对应1个value. 那这个数据库和我们网站在使 ...
- 2017-2018-2 20155309南皓芯 Exp4 恶意代码分析
实验后回答问题 (1)如果在工作中怀疑一台主机上有恶意代码,但只是猜想,所有想监控下系统一天天的到底在干些什么.请设计下你想监控的操作有哪些,用什么方法来监控. 答:我会使用sysmon工具来进行监控 ...
- (初)Knockout 监控属性(Observables)
1 创建带有监控属性的view model 1.1 Observables Knockout是在下面三个核心功能是建立起来的: 监控属性(Observables)和依赖跟踪(Dependency tr ...
- RxPermissions Usage
refs:https://github.com/tbruyelle/RxPermissions https://www.jianshu.com/p/c3546e5cd2ffhttps://www.ji ...
- Gradle: Download 下载慢的解决办法
应该是gradle被墙了,在网上查得:使用阿里云的国内镜像仓库地址,就可以快速的下载需要的文件: 修改项目根目录下的文件 build.gradle : buildscript { repositori ...
- 微信小程序--家庭记账本开发--05
界面跳转 在微信小程序中,按钮也是<button></button>标签,它是通过bindtap属性来绑定点击事件: <view class="usermott ...
- Python科学计算PDF
Python科学计算(高清版)PDF 百度网盘 链接:https://pan.baidu.com/s/1VYs9BamMhCnu4rfN6TG5bg 提取码:2zzk 复制这段内容后打开百度网盘手机A ...
- C#中异步调用示例与详解
using System; using System.Collections.Generic; using System.Text; using System.Runtime.InteropServi ...
- SoapUI破解及安装教程
之前学了一段时间的SoapUI,但是好久不用了,这里记录下专业版的破解的流程,后续的学习会不断更新. soapUI安装及破解(这里针对专业版) 下载地址:http://dl.eviware.com/l ...
- CSS,浮动及其影响
浮动(float): 让默认文档流(标准文档流)下的元素漂浮起来,水平排列. 通俗点来说,浮动可以让元素浮到第二层,而其他没有浮动的元素就往上排,而我们是俯视去看的,所以往上顶的那个元素就会被遮住,这 ...