Python中的上下文管理器和装饰器之间的区别
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Python中的上下文管理器和装饰器之间的区别,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1828字,纯文字阅读大概需要3分钟。
内容图文
![Python中的上下文管理器和装饰器之间的区别](/upload/InfoBanner/zyjiaocheng/718/b9091fca41604a9dbc7f043480e014fd.jpg)
两者之间的主要区别是什么?我一直在研究Python并遇到过它们.装饰器本质上是一个包装另一个函数的函数,你可以在特定函数执行之前和之后做任何事情.
def my_decorator(some_function):
def wrapper(*args, **kwargs):
print("Do something before the function is called")
some_function(*args, **kwargs)
print("Do something after the function is called")
return wrapper
@my_decorator
def addition(a, b):
result = a+b
print("Addition of {} and {} is {}".format(a,b,result))
但是在研究了Context Manager之后,我忍不住注意到它也有一个进入和退出,你可以在那里进行大多数类似的操作.
from contextlib import contextmanager
@contextmanager
def open_file(path, mode):
the_file = open(path, mode)
yield the_file
the_file.close()
files = []
for x in range(100000):
with open_file('foo.txt', 'w') as infile:
files.append(infile)
for f in files:
if not f.closed:
print('not closed')
屈服之前的所有东西都被视为“进入”的一部分,并且在“退出”的一部分之后的所有东西.
尽管上下文管理器和装饰器在语法上都是不同的,但它们的行为可以看作是相似的.那么区别是什么呢?当一个人应该使用其中任何一个时,有哪些不同的场景?
解决方法:
它们是完全独立的概念,不应该在同一个角度看待.
装饰器允许您在定义函数或类时对其进行扩充或替换.这比在函数调用之前或之后执行事务要广泛得多.当然,您的特定装饰器允许您在函数调用之前和之后执行某些操作,前提是不会引发异常,或者您显式处理异常.但您也可以使用装饰器向函数对象添加属性,或更新某种注册表.或者返回完全不同的东西并忽略原始功能.或者生成一个包装器来操作传入的参数,或者原始函数的返回值.上下文管理器不能执行任何这些操作.
另一方面,上下文管理器允许您抽象出try: ... finally: constructs,因为无论块如何退出,您都可以在块的末尾执行更多代码.即使块引发异常,或者使用return退出函数,无论如何都会调用上下文管理器__exit__方法.上下文管理器甚至可以抑制块中引发的任何异常.
否则这两个概念根本没有关系.当您需要对函数或类进行某些操作时,请使用装饰器.如果要在块结束后清理或执行其他操作,请使用上下文管理器.
内容总结
以上是互联网集市为您收集整理的Python中的上下文管理器和装饰器之间的区别全部内容,希望文章能够帮你解决Python中的上下文管理器和装饰器之间的区别所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。