python contextlib

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()

 

posted @ 2018-01-31 10:19  coder-sunyuw  阅读(85)  评论(0编辑  收藏  举报