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

    1. 装饰器
    
    # 装饰器
    def singleton(cls):
        instance = {}
        def inner(*args, **kw):
            if cls not in instance:
                instance[cls] = cls(*args, **kw)
            return instance[cls]
        return inner
    
    @singleton
    class A:
        pass
    
    a = A()
    b = A()
    
    print(a is b)
    
    
    1. 元类
    # 元类
    class Meta(type):
        def __init__(cls, *args, **kwargs):
            super().__init__(*args, **kwargs)
            cls.instance = None
    
        def __call__(cls, *args, **kwargs):
            if cls.instance is None:
                cls.instance = super(Meta, cls).__call__(*args, **kwargs)
            return cls.instance
    
    
    class A(metaclass=Meta):  # A 是 meta 的实例
        pass
    
    
    a = A()  # A() 会调用 meta 的 __class__()
    b = A()
    
    print(a is b)
    
    
    
    1. 构造函数
    
    # 构造方法
    class Base(object):
        def __new__(cls, *args, **kwargs):
            if not hasattr(cls, '_instance'):
                cls._instance = super(Base, cls).__new__(cls)
            return cls._instance
    
    class A(Base):
        pass
    
    a = A()
    b = A()
    
    print(a is b)
    
    
    
  • 相关阅读:
    spring容器启动
    springmvc流程
    bean作用域
    bean的生命周期
    web.xml详解
    设计模式 工厂和抽象工厂
    requests 模块
    爬虫基础
    提高级
    循环语句
  • 原文地址:https://www.cnblogs.com/wztshine/p/15525079.html
Copyright © 2011-2022 走看看