python魔术方法
Posted s-p-l
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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__方法方便。
以上是关于python魔术方法的主要内容,如果未能解决你的问题,请参考以下文章