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>

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

相关推荐
~|Bernard|几秒前
五,go语言的内存管理
开发语言·后端·golang
会开花的二叉树5 分钟前
从 C++ 转向 AI 应用工程:我的 Python 基础第一阶段复盘
c++·人工智能·python
Cx330❀5 分钟前
从零实现一个 C++ 轻量级日志系统:原理与实践
大数据·linux·运维·服务器·开发语言·c++·搜索引擎
AI玫瑰助手7 分钟前
Python流程控制:while循环嵌套与死循环避免技巧
开发语言·python·信息可视化
IT策士11 分钟前
Python 中间件系列:消息队列 RabbitMQ 操作
python·中间件·rabbitmq
一起逃去看海吧18 分钟前
Function Calling
python
孟陬18 分钟前
Node.js v26.0 新增超甜的语法糖 getOrInsert / getOrInsertComputed 介绍
python·node.js
wmm_会飞的@鱼20 分钟前
FlexSim-基于SLP方法的A汽车企业总装车间布局优化
前端·数据结构·数据库·python·数学建模·汽车
凯瑟琳.奥古斯特21 分钟前
深度学习入门:用PyTorch实现MNIST手写数字识别
pytorch·python·深度学习
源码之家22 分钟前
计算机毕业设计:Python智慧医疗问答系统 知识图谱 Flask框架 数据可视化 neo4j图数据库 大模型 agent(建议收藏)✅
大数据·python·数据挖掘·数据分析·flask·知识图谱·课程设计