zoukankan      html  css  js  c++  java
  • python单例模式

     使用模块

    python的模块在第一次导入时会生成.pyc文件,当第二次导入时就会直接加载.pyc文件,而不会再次执行模块代码。

    只需将其单独放在一个模块里,并创建一个实例,外部使用时直接调用该实例即可。

    使用__new__方法

    class Singleton:
        _instance = None
        def __new__(cls, *args, **kwargs):
            if cls._instance is not None:
                cls._instance = super().__new__(*args, **kwargs)
            return cls._instance
    
    
    class Myclass(Singleton):
        a = 1
    
    class1 = Myclass()
    class2 = Myclass()
    print(class1 is class2)

    使用装饰器

    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():
        a = 1
    class1 = Myclass()
    class2 = Myclass()
    print(class1 is class2)
        

    使用元类metaclass

    class Singleton(type):
        instances = {}
            def __call__(cls, *args, **kwargs):
                if cls not in cls.instances:
                    cls.instances[cls] = super().__call__(*args, **kwargs)
                return cls.instances[cls]
    
    class Myclass(metaclass=Singleton):
        a = 1
    
    class1 = Myclass()
    class2 = Myclass()
    print(class1 is class2)    
  • 相关阅读:
    JAVA线程池原理详解一
    并发工具类:CountDownLatch、CyclicBarrier、Semaphore
    JAVA并行框架:Fork/Join
    Mock Server实践
    MockWebServer使用指南
    mybatis学习笔记 spring与mybatis整合
    怎样使用Mock Server
    基于unittest测试框架的扩展
    运营商劫持
    单元测试实战手册
  • 原文地址:https://www.cnblogs.com/z1115230598/p/9917301.html
Copyright © 2011-2022 走看看