python魔术方法(二)

上下文管理:

文件IO操作可以对文件对象使用上下文管理,使用with...as语法

with open('test') as f: pass

当一个对象同时实现了__enter__()和__exit__()方法,就属于上下文管理的对象

__enter__:进入与此对象相关的上下文,如果存在该方法,with语法会把该方法的返回值绑定到as子句中指定的变量上,换句话说就是__enter__方法的返回值就是上下文使用的对象,with语法会把这个返回值赋给as子句的变量上

__exit__:退出与此对象相关的上下文

例:

实例化对象的时候,并不会调用enter,进入with语句块调用__enter__方法,然后执行语句体,最后离开with语句块的时候,调用__exit__方法。

with可以开启一个上下文运行环境,在执行之前做一些准备工作,执行后做一些收尾工作

 

__enter__方法没有参数

__exit__方法有3个参数:

__exit__(self,exc_type,exc_value,traceback),如果该上下文退出时没有异常,这三个参数都为None。

如果有异常,参数意义如下:exc_type:异常类型,exc_value:异常的值,traceback:异常的追踪信息

__exit__方法返回一个等效True的值,则压制异常,否则,继续抛出异常

例:为加法函数计数

一:使用装饰器显示该函数的执行时长

二、使用上下文实现

三、使用可调用对象实现

三、将类作为装饰器使用

 

上下文应用场景:

1、增强功能,在代码执行的前后增加代码,以增强功能,类似装饰器的功能

2、资源管理,打开了资源需要关闭,例如文件对象,网络连接,数据库连接等

3、权限验证,在执行代码前,做权限的验证,在__enter__中处理

 

contextlib.contexymanager:

它是一个装饰器实现上下文管理,装饰一个函数,不用像类一样实现__enter__和__exit__方法

 

如果业务逻辑简单可以使用函数加contextlib.contextmanager装饰器方式,如果业务复杂,用类的方式加__enter__和__exit__方法方便。

 

转载于:https://www.cnblogs.com/s-p-l/p/10258304.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值