zoukankan      html  css  js  c++  java
  • python中的单例

      单例模式是一种常用的软件设计模式,核心结构是只包含一个被称为单例类的特殊类,通过单例模式可以保证系统中只有一个实例而且该实例易于外界访问,从而控制实例数量来保证系统资源的节省。可以用于打印任务,以及类中实例只有一个的情况下。单例模式设计的类只能实例,单例的四种方法要了解,类的call方法要能默写。

     

    1 使用new 方法, 注意的是多线程无法支持这种方法创建的单例,因此要加锁,第一次判断是否单例对象,第二次判断是解决多线程下的问题。 推荐使用

    import threading
    class Singleton(object):
        lock = threading.Lock()
        def __new__(cls,*args,**kw):
            if not hasattr(cls,'_instance'):
                with Singleton.lock:
                    if not hasattr(Singleton, "_instance"):
                        cls._instance = object.__new__(cls)
            return cls._instance
    class MyClass(Singleton):
        print(1)
    MyClass()

    2 共享属性

    class Dic(object):
        _state = {}
        def __new__(cls,*args,**kw):
            obj = super().__new__(cls,*args,**kw)
            obj.__dict__ = cls._state
            return obj
    class MyClass(Dic):
        pass
    MyClass()

    3 装饰器

    def Singleton(cls):
        state = {}
        def wapper(*args,**kw):
            if cls not in state:
                state[cls] = cls(*args,**kw)
            return state
        return wapper
    @singleton
    class My_Singleton:
        pass

    4 import

    # Singleton.py
    class My_Singleton():
        def foo(self):
            pass
    # use.py
    from Singleton import My_Singleton
    My_Singleton.foo()

    5 call

    class My_Singleton(type):
        def __call__(cls,*args,**kw):
            if not hasattr(cls,'_instance'):
                cls._instance = super().__call__(*args,**kw)
            return cls._instance
    class My_Class(metaclass=My_Singleton):
        def __init__(self, name):
            self.name = name
    print(My_Class('123'))
    print(My_Class('456'))
  • 相关阅读:
    java io 学习笔记(一)
    Centos中查看系统信息的常用命令
    arcgis影像批量裁剪代码
    VS2010中VC++目录和C/C++之间的区别。VC++ Directories和C/C++的区别。
    VS中为什么不同的项目类型属性查看和设置的界面不一样
    C++函数中返回引用和返回值的区别
    java中HashMap的keySet()和values()
    repoquery详解——linux查看包依赖关系的神器
    linux学习笔记
    log4j的AppenderLayout格式符
  • 原文地址:https://www.cnblogs.com/wang-kai-1994/p/10374954.html
Copyright © 2011-2022 走看看