zoukankan      html  css  js  c++  java
  • 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
      

        

  • 相关阅读:
    Mint linux中调整屏幕亮度的方法
    poj 1085 Triangle War (状压+记忆化搜索)
    CF1060F Shrinking Tree
    leetcode492
    leetcode258
    leetcode226
    leetcode371
    leetcode104
    leetcode389
    leetcode448
  • 原文地址:https://www.cnblogs.com/changtao/p/10732737.html
Copyright © 2011-2022 走看看