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__方法方便。

猜你喜欢

转载自www.cnblogs.com/s-p-l/p/10258304.html