返回顶部
首页 > 资讯 > 后端开发 > Python >python3实现单例模式
  • 497
分享到

python3实现单例模式

模式 2023-01-31 08:01:34 497人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

单例模式指确保某个类在整个系统中只存在一个实例的一种设计模式使用单例模式的好处:1、每个实例都会占用一定的内存资源,且初始化实例时会影响运行性能,所以当整个系统只需一个实例时,使用单例模式不仅可减少资源占用,而且因为只初始化一次,还可以加

单例模式指确保某个类在整个系统中只存在一个实例的一种设计模式
使用单例模式的好处:
1、每个实例都会占用一定的内存资源,且初始化实例时会影响运行性能,所以当整个系统只需一个实例时,使用单例模式不仅可减少资源占用,而且因为只初始化一次,还可以加快运行性能。例如当程序通过一个类来读取配置信息,而程序多个地方需要使用配置信息,这时整个程序运行过程中只需一个实例对象即可,可减少占用内存资源,同时还可以保证程序在多处地方获取的配置信息一致。
2、使用单例模式可进行同步控制,计数器同步、程序多处读取配置信息这些情景下若只存在一个实例,即可保证一致性。

python中,一般可使用一下4种方式实现单例模式:

1、通过模块调用
2、使用__new__方法
3、使用装饰器
4、使用元类(metaclass)

一、通过模块调用

做法:将需要实现单例的类写在模块文件中,然后通过import引入该模块,即可得到单例对象。
原理:在python3中,首次导入模块文件时,会在程序目录下的__pycache__目录中生成pyc文件,之后再导入时,将直接加载pyc文件。从而实现单例。

实现代码:

  • module_demo.py
    class singleton_cal:
    def foo(self):
         pass
    export_singleton = singleton_cal()
  • use_module.py
    from module_demo import export_singleton
    a = export_singleton
    from module_demo import export_singleton
    b = export_singleton
    print(a == b)
    print(id(a) == id(b))

    python3实现单例模式
    可发现,多次调用/导入模块,使用的都是同一个实例对象

二、使用__new__方法

_new__与_init__的区别:
__new\
:创建实例对象时调用的构造方法
_init_:初始化方法,用于设置实例的相关属性
Python创建实例时,会先调用__new__构造方法,然后使用__init__进行实例初始化。
我们可以通过__new__来影响实例的创建,从而实现单例。

实现代码:

  • use_new.py
class Singleton(object):
    __instance = None
    def __new__(cls,*args,**kwargs):
        if not cls. __instance:
            cls.__instance = super().__new__(cls,*args,**kwargs)
        return cls.__instance

a = Singleton()
b = Singleton()
print(a == b)
print(id(a) == id(b))

python3实现单例模式
上面代码中,声明了一个私有类变量__instance,当__instance不为None时,代表系统中已有实例,直接返回该实例,若__instance为None时,表示系统中还没有该类实例,则创建新实例并返回。

三、使用装饰器

  • use_decorator.py
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 singleCls(object):
def foo(self):
    pass
a = singleCls()
b = singleCls()
print(a == b)
print(id(a) == id(b))

python3实现单例模式
只有当第一次调用singleCls时,装饰器才会从instances={}开始执行,之后调用singleCls时,都只执行getinstance函数,这是装饰器的特性,利用这个特性,当我们多次调用singleCls时,在getinstance函数中判断该类是否存在于instances字典中,若不存在,则创建该类实例并加入instances字典中,并返回字典中该类的实例;若存在,则直接返回字典中该类的实例。可利用该装饰器为多个类实现单例。

四、使用元类(metaclass)

元类创建了所有的类型对象(包括object对象),系统默认的元类是type。
python3实现单例模式
实例,类,父类,元类的关系可表示为下图
python3实现单例模式
元类中的__call方法,在已该类为元类的类创建实例时调用,例如:类A以类B为元类,当A创建实例时,B中的\call将会被调用。利用\call__可实现对实例创建的控制。

实现代码:

  • use_metaclass.py
class SingletonMeta(type):
    __instance = None
    def __call__(cls,*args,**kwargs):
        if not cls.__instance:
            cls.__instance = type.__call__(cls,*args,**kwargs)
        return cls.__instance

class myclass(metaclass = SingletonMeta):
    def foo(self):
        pass

a = myclass()
b = myclass()
print(a==b)
print(id(a)==id(b))

python3实现单例模式
自定义元类时,通常继承自type,声明一个私有类变量__instance保存类实例,当__instance为None时,调用type的__call__方法为类创建实例,保存到__instance并返回;若__instance不为None,则直接返回__instance,不重新创建实例。
欢迎扫码关注公众号“KeepCode”,分享更多技术好文,并提供技术电子书籍免费下载,每天进步一点点~~~~
python3实现单例模式

--结束END--

本文标题: python3实现单例模式

本文链接: https://lsjlt.com/news/192885.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • python3实现单例模式
    单例模式指确保某个类在整个系统中只存在一个实例的一种设计模式使用单例模式的好处:1、每个实例都会占用一定的内存资源,且初始化实例时会影响运行性能,所以当整个系统只需一个实例时,使用单例模式不仅可减少资源占用,而且因为只初始化一次,还可以加...
    99+
    2023-01-31
    模式
  • Python实现单例模式
    1.什么是单例? 确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例,这个类称为单例类,单例模式是一种对象创建型模式。那么单例模式有什么用途呢?举个常见的单例模式例子,我们平时使用的电脑上都有一个回收站,在整个操作系统中,回...
    99+
    2023-01-31
    模式 Python
  • python单例模式之seleniumdriver实现单例
    目录一、使用装饰器实现单例二、web自动化driver实现单例模式2.1 编写单例模式的装饰器2.2 driver 使用装饰器,实现单例模式2.3 获取driver的实例,就是单例了...
    99+
    2024-04-02
  • 如何实现单例模式
    本篇文章给大家分享的是有关如何实现单例模式,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。header("Content-type:t...
    99+
    2024-04-02
  • Singleton单例模式怎么实现
    这篇“Singleton单例模式怎么实现”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Si...
    99+
    2024-04-02
  • java单例模式如何实现
    本篇内容主要讲解“java单例模式如何实现”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“java单例模式如何实现”吧!0x01 宫女请安在朕的后宫中,皇后当之无愧的是天下第一(朕只能当...
    99+
    2023-06-19
  • Android如何实现单例模式
    这篇文章主要介绍了Android如何实现单例模式,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一.饿汉式public class SingletionSt...
    99+
    2023-06-15
  • C++怎么实现单例模式
    本篇内容介绍了“C++怎么实现单例模式”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!多线程环境下的单例模式Instance方法是这样实现的:...
    99+
    2023-06-19
  • php单例模式怎么实现
    PHP单例模式可以通过以下步骤实现:1. 创建一个类,并将构造函数设为私有,以防止外部直接实例化该类。2. 在类内部创建一个静态私有...
    99+
    2023-09-29
    php
  • JavaScript如何实现单例模式
    小编给大家分享一下JavaScript如何实现单例模式,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!单例模式通过 ES6 的 Proxy 拦截构造函数的执行方法来...
    99+
    2023-06-27
  • PHP单例模式如何实现
    这篇文章主要介绍“PHP单例模式如何实现”,在日常操作中,相信很多人在PHP单例模式如何实现问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”PHP单例模式如何实现”的疑惑有所帮助!接下来,请跟着小编一起来学习吧...
    99+
    2023-07-04
  • golang单例模式怎么实现
    Go语言中的单例模式可以通过以下几种方式来实现: 使用全局变量:定义一个全局变量,在需要使用单例对象的地方直接使用该全局变量。在包...
    99+
    2023-10-21
    golang
  • android单例模式怎么实现
    在Android中,可以通过以下几种方式实现单例模式:1. 懒汉式```javapublic class Singleton {pr...
    99+
    2023-08-23
    android
  • java单例模式怎么实现
    Java中单例模式的实现方法有以下几种:1. 懒汉式(线程不安全):```public class Singleton {priva...
    99+
    2023-08-23
    java
  • Java设计模式的单例模式如何实现
    这篇文章主要介绍了Java设计模式的单例模式如何实现的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Java设计模式的单例模式如何实现文章都会有所收获,下面我们一起来看看吧。单例模式单例模式顾名思义就是单一的实例...
    99+
    2023-06-29
  • java设计模式中如何实现单例模式
    这篇文章将为大家详细讲解有关java设计模式中如何实现单例模式,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。下面是一个简单的小实例://简单懒汉式 public class ...
    99+
    2023-05-30
    java
  • java设计模式之怎么实现单例模式
    这篇文章主要介绍了java设计模式之怎么实现单例模式的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇java设计模式之怎么实现单例模式文章都会有所收获,下面我们一起来看看吧。单元素的枚举类型经常成为实现 Sing...
    99+
    2023-07-04
  • Android设计模式之单例模式实例
    目录一、概念1.1 单例类1.2 优缺点1.2.1 优点1.2.2 缺点二、创建单例模式的方法2.1 饿汉式2.2 懒汉式2.2.1 懒汉式(非线程安全)2.2.2 懒汉式(线程安全...
    99+
    2023-05-16
    Android单例模式 Android设计模式单例模式
  • js单例模式如何实现模态框
    这篇文章给大家分享的是有关js单例模式如何实现模态框的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。什么是单例呢?单,就是一个的意思。例:就是实例化出来的对象,那合在一起就是保证一...
    99+
    2024-04-02
  • java的单例模式怎么实现
    今天小编给大家分享一下java的单例模式怎么实现的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作