码迷,mamicode.com
首页 > 编程语言 > 详细

python魔术方法(二)

时间:2019-01-12 01:03:42      阅读:299      评论:0      收藏:0      [点我收藏+]

标签:上下   资源管理   类型   显示   技术分享   elf   上下文   增加   异常   

上下文管理:

文件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魔术方法(二)

标签:上下   资源管理   类型   显示   技术分享   elf   上下文   增加   异常   

原文地址:https://www.cnblogs.com/s-p-l/p/10258304.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!