3.4.2 上下文管理器作为函数修饰符
类contextDecorator增加了对常规上下文管理器类的支持,因此其不仅可以作为上下文管理器,也可以作为函数修饰符。
import contextlib
class Context(contextlib.ContextDecorator):
def __init__(self,how_used):
self.how_used = how_used
print('__init__({})'.format(how_used))
def __enter__(self):
print('__enter__({})'.format(self.how_used))
return self
def __exit__(self,exc_type,exc_val,exc_tb):
print('__exit__({})'.format(self.how_used))
@Context('as decorator')
def func(message):
print(message)
print()
with Context('as context manager'):
print('Doing work in the context')
print()
func('Doing work in the wrapped function')
使用上下文管理器作为修饰符时有一点不同,enter()返回的值在被修饰的函数中不可用,这与使用with和as时不一样。传入被修饰函数的参数可以正常使用。
运行结果: