python元类实现单例模式

什么是单例模式?

单例模式是一种创建型设计模式,它保证一个类只有一个实例,并提供一个全局访问点来访问该实例

下面看一下最初代码:(具体内容可以参看之前的文章https://mp.csdn.net/mp_blog/creation/editor/136640949)

python 复制代码
class MyType(type):

    def __init__(self, name, bases,attrs):
        super().__init__(name, bases,attrs)

    def __call__(self, *args, **kwargs):
        # 调用本类的__new__方法去创建对象
        empty_obj = self.__new__(self)
        # 调用本类中的__init__方法初始化Foo类
        self.__init__(empty_obj, *args, **kwargs)

        return empty_obj


class Foo(object, metaclass=MyType):
    pass

下面我想实现单例模式就可以:

在创建类Foo的时候创建一个类变量,用于存储刚开始创建的对象,并且后续在程序中再创建一次只会得到同一个对象

那该在哪修改呢?

可以在Foo的元类中进行修改,在元类MyType调用new和init创建类时进行一些扩展

具体怎么做呢?

  1. 在元类初始化的时候创建一个变量instance,让他的默认值为None,该变量用来判断是否创建过对象
python 复制代码
    def __init__(self, name, bases,attrs):
        super().__init__(name, bases,attrs)
        # 初始设置该变量为None,表示没有创建过对象
        self.instance = None
  1. 当Foo类实例化的时候,会调用元类的call方法,我们将call方法中的init方法稍作变化,优先判断是否有对象,没有才创建
python 复制代码
    def __call__(self, *args, **kwargs):
        # 判断是否已有对象,没有则创建
        if self.instance is None:
            self.instance = self.__new__(self)

        self.__init__(self.instance, *args, **kwargs)

        return self.instance

此时测试一下同时利用Foo实例化两次的结果:地址完全相同

python 复制代码
v1 = Foo()
v2 = Foo()
print(v1)  # <__main__.Foo object at 0x00000260EB61CF90>
print(v2)  # <__main__.Foo object at 0x00000260EB61CF90>

此外,需要注意的是,当子类继承父类时,父类的元类即是子类的元类

相关推荐
爱睡懒觉的焦糖玛奇朵2 小时前
【从视频到数据集:焦糖玛奇朵的魔法工具使用说明】
人工智能·python·深度学习·学习·算法·yolo·音视频
潜创微科技2 小时前
IT6520:USB‑C 转 MIPI 芯片方案 4K@120Hz 高清显示
c语言·开发语言
yangshicong3 小时前
第11章:结构化输出与数据提取 —— 让 AI 直接返回你想要的数据格式
数据库·人工智能·redis·python·langchain·ai编程
言之。3 小时前
【Python】免费的中文 AI 配音方案
开发语言·人工智能·python
Warson_L3 小时前
python dict key详解
python
天天进步20153 小时前
Python全栈项目:从零手操一个高性能 API 网关
开发语言·python
Java面试题总结3 小时前
java高频面试题(2026最新)
java·开发语言·jvm·数据库·spring·缓存
安生生申4 小时前
使用pygame实现2048
开发语言·python·pygame
hh.h.5 小时前
CANN算子开发入门:从零开始写第一个Ascend C算子
c语言·开发语言·cann·c算子
AI科技星5 小时前
全域数学·第三部·数术几何部·平行网格卷 完整专著目录(含拓扑发展史+学科定位·终稿)
c语言·开发语言·网络·量子计算·agi