contextlib 上下文管理器
创建上下文管理实际就是创建一个类,添加enter和exit方法
class OpenContext(object):
def __init__(self, filename, mode):
self.fp = open(filename, mode)
def __enter__(self):
return self.fp
def __exit__(self, exc_type, exc_val, exc_tb):
self.fp.close()
with OpenContext('/tmp/a.txt', 'a') as file_obj:
file_obj.write("hello 6666")
Python标准库还提供了更加易用的上下文管理器工具模块contextlib
from contextlib import contextmanager
@contextmanager
def make_open_context(filename, mode):
fp = open(filename, mode)
try:
yield fp
finally:
fp.close()
with make_open_context('/tmp/a.txt', 'a') as file_obj:
file_obj.write("hello carson666")
sql中的上下文
@contextlib.contextmanager
def session_ctx(throw_ex=True):
"""
Session上下文管理器
:return: Session
"""
# logging.debug("session_ctx open session")
try:
session = Session()
yield session
except Exception as e:
tb = e.__traceback__
if tb.tb_next is not None:
tb = tb.tb_next
es = "{}:{}:{}".format(tb.tb_frame.f_code.co_filename, e.__class__.__name__, tb.tb_lineno)
# logging.warning("db context error %s %s", es, e)
if throw_ex:
raise e
finally:
if locals().get('session', None):
# logging.debug('session_ctx close session')
locals()['session'].close()
单例(鸭子类)
单例模式是一种常见的软件设置模式,在它的核心结构中只包含一个被称为单例类的特殊类,通过单例模式可以保证==系统中的一个类只有一个实例而且该实例易于外界访问==,从而方便对实例个数的控制并节约系统资源。如果希望在系统中某个对象只能存在一个,单例模式是最好的解决方案。
单例模式的要点有三类
- 某个类只能有一个实例
- 它必须创建这个实例
- 它必须自行向整个系统提供这个实例
但是从具体角度实现来说的话,又可以分为三点
- 单例模式的类只能提供私有的构造函数
- 类定义中含有一个该类的静态私有对象
- 该类提供了一个静态的共有的函数用于创建或获取它本身的静态私有对象
一、实例控制
单例模式会阻止其他对象实例化其自己的单例对象的副本,从而确保所有对象都访问唯一实例。
二、灵活性
因为类控制了实例化过程,所以类可以灵活更改实例化过程。
缺点:
一、开销
虽然数量很少,但如果每次对象请求引用时都要检查是否存在类的实例,将仍然需要一些开销。可以通过使用静态初始化解决此问题。
二、可能的开发混淆
使用单例对象(尤其在类库中定义的对象)时,开发人员必须记住自己不能使用 new关键字实例化对象。因为可能无法访问库源代码,因此应用程序开发人员可能会意外发现自己无法直接实例化此类。
三、对象生存期
不能解决删除单个对象的问题。在提供内存管理的语言中(例如基于.NET Framework的语言),只有单例类能够导致实例被取消分配,因为它包含对该实例的私有引用。在某些语言中(如 C++),其他类可以删除对象实例,但这样会导致单例类中出现悬浮引用==。==
class Singleton(type):
"""
单例工具metaclass
"""
_instances = {}
def __call__(cls, *args, **kwargs):
if cls not in cls._instances:
cls._instances[cls] = super(Singleton, cls).__call__(*args, **kwargs)
return cls._instances[cls]
网友评论