在python中并不是只有open()函数返回的fp对象才能使用with语句。实际上,任何对象,只要正确实现了上下文管理,就可以用于with语句。
1.@contextmanager
@contextmanager 的作用就是我们可以把一个非自定义类改成一个上下文管理器。
上下文管理器 是有 enter__和__exit ,那么我们可以为需要改写的普通类创建一个子类,在其中添加上__enter__和__exit__方法通过继承父类的方式实现上下文管理器。但是通过contextlib模块下提供的@contextmanager装饰器,我们能够更方便的将一个普通类变成上下文管理器。
实例:
# -*- coding: utf-8 -*-
# @Time : 2022/4/26 12:47
# @File : contextlibdemo.py
# @Software : PyCharm
from contextlib import contextmanager
class BusinessDao(object):
def __init__(self, name):
self.name = name
def save(self):
print('save %s...' % self.name)
@contextmanager
def inject_logging(name):
print('Begin write logger...')
q = BusinessDao(name)
yield q
print('End write logger...')
with inject_logging('Students') as s:
s.save()
运行结果:
Begin write logger...
save Students...
End write logger...
可以看出 @contextmanager 将原本不是上下文管理器的类变成了上下文管理器而无需修改类中的代码,这个思想和Java的动态代理(AOP)思想异曲同工,所谓AOP就是可以通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态统一添加功能的一种技术。