with上下文管理协议
with open('data.txt', 'r') as f:
lines = f.readlines()
for line in lines:
print(line.split())
类上面这段代码在python中很常见,就是使用with去管理资源。
其原理就是使用__entry__ 和__exit__ 这两个魔法函数、
下面编写一个示例,模拟with的功能
class Person:
def __init__(self, name):
print('初始化一个人.....'+ name)
self.name = name # 可以看成是获取资源
def __enter__(self):
print('出生')
return self # 可以看成是释放资源
def __exit__(self, exc_type, exc_val, exc_tb):
print('死亡') def work(self):
print(self.name + '工作30年') if __name__ == '__main__':
p = Person('小明')
p.work() print('------------------') with Person('小明') as person:
person.work()
打印结果如下:
['name', 'admin']
['age', '']
初始化一个人.....小明
小明工作30年
------------------
初始化一个人.....小明
出生
小明工作30年
死亡
在某些场景 ,我们就可以使用with上下文管理器去写代码,可以大大的简化代码量!
是不是感觉很牛逼。。。。
不,python中还有一个内置的上下文管理库contextlib, 使用它看起来就更牛逼了,请看下面代码
import contextlib @contextlib.contextmanager
def work():
print("出生")
#yield {}
yield
print("死亡") with work() as w:
print('工作30年.....')
打印结果:
出生
工作30年.....
死亡
with上下文管理协议的更多相关文章
- Python 上下文管理协议中的__enter__和__exit__基本理解
所谓上下文管理协议,就是咱们打开文件时常用的一种方法:with __enter__(self):当with开始运行的时候触发此方法的运行 __exit__(self, exc_type, exc_va ...
- 上下文管理协议with open as
我们知道在操作文件对象的时候可以这么写 with open('a.txt') as f: '代码块' 上述叫做上下文管理协议,即with语句,为了让一个对象兼容with语句,必须在这个对象的类中声明_ ...
- 用python优雅打开文件及上下文管理协议
有次面试被问到如何优雅地打开一个文件? 那就是用with语句,调用过后可以自动关闭. 但是为什么使用with语句就可以自动关闭呢,原因就是上下文管理协议. 上下文管理协议:包含方法 __e ...
- 上下文管理协议with_open,__enter__和__exit__(三十八)
在操作文件对象的时候可以这么写 with open('a.txt') as f: '代码块' 上述叫做上下文管理协议,即with语句,为了让一个对象兼容with语句,必须在这个对象的类中声明__ent ...
- python - 上下文管理协议(with + __enter__ + __exit__)
上下文管理协议: with + __enter__ + __exit__ #上下问管理协议: #with + __enter__ + __exit__ class Test(): def __init ...
- Python概念-上下文管理协议中的__enter__和__exit__
所谓上下文管理协议,就是咱们打开文件时常用的一种方法:with __enter__(self):当with开始运行的时候触发此方法的运行 __exit__(self, exc_type, exc_va ...
- python 面向对象编程 之 上下文管理协议
with open('path', 'r' ,encoding='utf-8') as f: 代码块 上述就叫做上线文管理协议,即with语句,为了让一个对象兼容with语句,必须在这个对象的类中声明 ...
- python上下文管理协议
所谓上下文管理协议,就是咱们打开文件时常用的一种方法:with __enter__(self):当with开始运行的时候触发此方法的运行 __exit__(self, exc_type, exc_va ...
- Python上下文管理协议:__enter__和__exit__
上下文管理器(context manager)是Python2.5开始支持的一种语法,用于规定某个对象的使用范围.一旦进入或者离开该使用范围,会有特殊操作被调用 (比如为对象分配或者释放内存).它的语 ...
- python 描述符 上下文管理协议 类装饰器 property metaclass
1.描述符 #!/usr/bin/python env # coding=utf-8 # 数据描述符__get__ __set__ __delete__ ''' 描述符总结 描述符是可以实现大部分py ...
随机推荐
- Eclipse设置控制台日志输出位置
1.选择服务器配置 2.设置输出文件路径
- delphi中的inpubox,如何能控制它的位置? 10
https://zhidao.baidu.com/question/153270855.html delphi中的inpubox,如何能控制它的位置? 10 RT ! 前辈!最好你就把那代码都拿出来吧 ...
- 练习3-python-创造百万条数据库数据
有时候需求大批量的数据做测试支撑,如果使用传统的添加数据的方式可能比较耗费时间,利用python可以轻松的完成这项任务,还可以后续维护使用脚本. 方法1:insert into table selec ...
- DP---DAG、背包、LIS、LCS
DP是真的难啊,感觉始终不入门路,还是太弱了┭┮﹏┭┮ DAG上的DP 一般而言,题目中如果存在明显的严格偏序关系,并且求依靠此关系的最大/最小值,那么考虑是求DAG上的最短路或者是最长路.(据说 ...
- 时间同步,使用oracle自带的ctss
crsctl check ctss --observer mode cluvfy comp clocksync -检查crss为啥没启用 根据不同版本删除ntp的配置和服务 AIX: stops ...
- javascript中json字符串对象转化
li = [1,2,3,4] s = JSON.stringify(li) ---转化为字符串 JSON.parse(s) --转化为对象
- PHP中的异常和错误(转载)
博客好久没有更新了,实在惭愧,最近在忙人生大事,哈哈!这段时间没有看什么新的东西,结合项目中遇到的PHP异常处理问题,我又重新梳理了之前模糊的概念,希望对大家理解PHP异常处理有所帮助. 请一定要注意 ...
- [BZOJ1492] [NOI2007] 货币兑换Cash(cdq分治+斜率优化)
[BZOJ1492] [NOI2007] 货币兑换Cash(cdq分治+斜率优化) 题面 分析 dp方程推导 显然,必然存在一种最优的买卖方案满足:每次买进操作使用完所有的人民币:每次卖出操作卖出所有 ...
- BZOJ 1085(IDA*)
题面 传送门 分析 首先,直接搜索肯定会TLE 很容易想到用迭代加深的方法,限定搜索深度 但是,这样仍然不够,需要用启发式的方法优化 我们设计一个估价函数f(x)=g(x)+h(x)f(x)=g(x) ...
- AcWing 802. 区间和
(https://www.acwing.com/problem/content/804/) 假定有一个无限长的数轴,数轴上每个坐标上的数都是0. 现在,我们首先进行 n 次操作,每次操作将某一位置x上 ...