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 的 __call__() 方法
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)


posted @   wztshine  阅读(96)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
历史上的今天:
2020-11-08 python操作xml
2020-11-08 python xpath查找元素
点击右上角即可分享
微信分享提示