from contextlib import contextmanager #定义一个类其实这就是很普通的类,任何的类都可以替换这个类 class Query(object): def __init__(self, name): self.name = name def query(self): print('Query info about %s'%self.name) #需要一个过程化的方法,如果说有需要销毁资源的地方,就写在yield之后。 @contextmanager def create_query(name): print('Begin') q = Query(name) yield q print('End') #把这个当做资源来使用with with create_query('Bob') as q: q.query()
我比较喜欢这种。__enter__()和__exit__()方法却有一个优势就是可以整合成为完全的面向对象的方式。而上面这种,似乎看起来只能是面向过程的
class Query(object): def __init__(self, name): self.name = name def __enter__(self): print('Begin') return self def __exit__(self, exc_type,exc_value,traceback): if (exc_type): print('Error') else: print('End') def query(self): print('Query info about %s....' % self.name) with Query('Bob') as q: q.query()