• 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
      

        

  • 相关阅读:
    前端开发 Knockout
    一套基于Spring Boot+Vue+Shiro前后端分离的代码生成器
    七个开源的 Spring Boot 前后端分离项目
    Java老司机:把这些主流技术搞懂,拿20K没问题
    svn无法cleanup解决方案
    软件测试-1挡板测试
    电子琴
    myeclipse10激活注册码生成器代码
    LNK2005
    无法打开包含文件:"fstream.h"
  • 原文地址:https://www.cnblogs.com/changtao/p/10732737.html
Copyright © 2020-2023  润新知