Python中的单例模式

1.理解单例模式:

单例模式是一种常见的软件设置模式,在它的核心结构中只包含一个被称为单例类的特殊类,

通过单例模式可以保证系统中的一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源。

如果希望在系统中某个对象只能存在一个,单例模式是最好的解决方案.

  • 某个类只能有一个实例

  • 它必须创建这个实例

  • 它必须自行向整个系统提供这个实例

  • 但是从具体角度实现来说的话,又可以分为三点

    • 单例模式的类只能提供私有的构造函数

    • 类定义中含有一个该类的静态私有对象

    • 该类提供了一个静态的共有的函数用于创建或获取它本身的静态私有对象

总结:单利模式存在的目的是保证当前内存中仅存在单个实例,避免内存浪费!

2.实现单例模式的方法:

  • 使用模块

  • #test.py
    class MyClass(object):
        def foo(self):
            print('MyClass.foo')
    my_class_obj=MyClass()
    将上面的代码保存在文件 test.py 中,然后这样使用:
    
    将上面的代码保存在test.py 文件中就可以
    from .test import my_class_obj
    my_class_obj.foo()
    

      

  • 使用 __new__

  • class Teacher:
          flag = None
         def __new__(cls, *args, **kwargs):
               if cls.flag is None:
                       cls.flag = object.__new__(cls) # 这一句话只能走一次
               return cls.flag
          def __init__(self,name):
               self.name = name
    #保证线程安全添加锁(推荐使用)
    class
    Teacher: from threading import Lock lock = Lock() flag = None def __new__(cls, *args, **kwargs): with cls.lock: if cls.flag is None: cls.flag = object.__new__(cls) # 这一句话只能走一次 return cls.flag def __init__(self,name): self.name = name

     

  • 使用装饰器(decorator)

  • from functools import wraps
     
     
    def singleton(cls):
        instances = {}
     
        @wraps(cls)
        def getinstance(*args, **kwargs):
            if cls not in instances:
                instances[cls] = cls(*args, **kwargs)
            return instances[cls]
     
        return getinstance
     
     
    @singleton
    class MyClass(object):
        a = 1
    

      

  • 使用元类(metaclass)

  • class Singleton(type):
        _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]
     
     
    # Python2
    # class MyClass(object):
    #     __metaclass__ = Singleton
     
    # Python3
    class MyClass(metaclass=Singleton):
       pass
    

      

 

posted @ 2019-04-18 22:04  Py浪涛  阅读(344)  评论(0编辑  收藏  举报
你想听歌吗o((;=゚ 3゚ =))o~♪