美文网首页
Python中的单例

Python中的单例

作者: MontyOak | 来源:发表于2017-07-15 10:10 被阅读65次

单例(Singleton)是一种非常常见的设计模式,通过单例模式应该达到:

  • 一个类只能有一个实例
  • 该实例可被访问

Python所具备的动态语言的特性,让单例的实现有了多种思路:

  1. __new__入手 __new__是python中类的实力创建方法,它返回一个类来供__init__进行类的初始化
class Singleton(object):
    def __new__(cls, *args, **kw):
        if not hasattr(cls, '_instance'):
            orig = super(Singleton, cls)
            cls._instance = orig.__new__(cls, *args, **kw)
        return cls._instance

针对可能存在的并发情况,可以加上经典的双检查锁机制

class Singleton(object):
    objs = {}
    objs_mutex = threading.Lock()
    def __new__(cls, *args, **kwargs):
        if cls in cls.objs:
            return cls.objs[cls]
        cls.objs_mutex.acquire()
        try:
            if cls in cls.objs:
                return cls.objs[cls]
            cls.objs[cls] = object.__new__(cls)
        finally:
            cls.objs_mutex.release()
  1. Borg模式(也叫Monostate模式)
    即创建实例时把所有实例的__dict__指向同一个字典,这样虽然并非严格的单例(实际上创造了多个实例),但每个实例所表现出来状态(属性)和行为(方法)都是一致的。
class Borg(object):
    _state = {}
    def __new__(cls, *args, **kw):
        ob = super(Borg, cls).__new__(cls, *args, **kw)
        ob.__dict__ = cls._state
        return ob
  1. 装饰器实现 利用装饰器的变量空间来存储已经发生过实例化的对象,当其再次发生实例化的时候直接将之前的实例返回
def Singleton(cls, *args, **kw):
    instances = {}
    def getinstance():
        if cls not in instances:
            instances[cls] = cls(*args, **kw)
        return instances[cls]
    return getinstance
...
@Singleton
  1. import方法
    模块实现有着诸多的好处:
  2. 所有变量都在模块的命名空间中
  3. 模块只会初始化一次
  4. import是串行的,天然具备线程安全
# singleton.py
class Singleton(object):
    def foo(self):
        pass

my_singleton = My_Singleton()

# main.py
from mysingleton import my_singleton
...
``` 

相关文章

  • Python设计模式 之 Borg模式

    Borg模式 是单例模式在python中的变种。传统单例模式在python中,存在继承兄弟类之间状态隔离的问题。 ...

  • 2018-06-19 Python中的单例模式的几种实现方式的及

    转载自: Python中的单例模式的几种实现方式的及优化 单例模式 单例模式(Singleton Pattern)...

  • Python 面向对象7: 单例模式

    一、内容 1.1、单例设计模式 1.2、__new__方法 1.3、Python 中的单例 二、单例设计模式 2....

  • python 单例

    仅用学习参考 目标 单例设计模式 __new__ 方法 Python 中的单例 01. 单例设计模式 设计模式设计...

  • python中OOP的单例

    目录 单例设计模式 __new__ 方法 Python 中的单例 01. 单例设计模式 设计模式设计模式 是 前人...

  • 单例

    目标 单例设计模式 __new__ 方法 Python 中的单例 01. 单例设计模式 设计模式设计模式 是 前人...

  • python 单例

    单例022_对象分配空间和初始化.png 目标 单例设计模式 __new__ 方法 Python 中的单例 01....

  • python单例和装饰器

    Python相关分享 单例 单例的定义: 单例模式,是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例...

  • Python中的单例

    单例(Singleton)是一种非常常见的设计模式,通过单例模式应该达到: 一个类只能有一个实例 该实例可被访问 ...

  • Python中的单例

    通常,我们根据需要创建许多类的对象。有时,创建多个对象可能会占用大量资源。 实际示例可以是数据库连接类。您不希望有...

网友评论

      本文标题:Python中的单例

      本文链接:https://www.haomeiwen.com/subject/dbxehxtx.html