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'))
  • 相关阅读:
    1321棋盘问题
    2488A Knight's Journey
    1947Rebuilding Roads
    2057The Lost House
    2196Specialized Four-Digit Numbers
    /etc/sysctl.conf
    运维五步走
    虚拟机无法获得使用权问题
    ST/FC/SC/LC光纤的区别及适用场合;光纤适配器PC、APC和UPC区别
    Unity3D Kinect 控制人物模型
  • 原文地址:https://www.cnblogs.com/wang-kai-1994/p/10374954.html
Copyright © 2011-2022 走看看