首页 > 其他分享 >单例

单例

时间:2023-11-13 16:33:05浏览次数:20  
标签:__ Singleton instance 单例 ._ def cls

什么是单例模式?单例模式是指:保证一个类仅有一个实例,并提供一个访问它的全局访问点
# 线程1 执行:
cursor.excute('select * from user')

# 线程2执行 
cursor.excute('select * from books')

# 线程1 执行
cursor.fetchAll() # 拿出查询到的数据

# django ,每个线程,一个连接对象---》 连接池

1.使用模块

其实,Python 的模块就是天然的单例模式,因为模块在第一次导入时,会生成 .pyc 文件,当第二次导入时,就会直接加载 .pyc 文件,而不会再次执行模块代码。因此,我们只需把相关的函数和数据定义在一个模块中,就可以获得一个单例对象了。如果我们真的想要一个单例类,可以考虑这样做:

mysingleton.py

class Singleton(object):
    def foo(self):
        pass
singleton = Singleton()

将上面的代码保存在文件 mysingleton.py 中,要使用时,直接在其他文件中导入此文件中的对象,这个对象即是单例模式的对象

from a import singleton

2.使用装饰器

def Singleton(cls):
    instance = None

    def _singleton(*args, **kargs):
        nonlocal instance
        if instance is None:
            instance = cls(*args, **kargs)
        return instance

    return _singleton


@Singleton
class A(object):
    def __init__(self, x=0):
        self.x = x


a1 = A(2)
a2 = A(3)
print(a1.x)
print(a2.x)

print(a1 is a2)

3.使用类方法

class Singleton(object):
    _instance=None
    def __init__(self):
        pass
        
    @classmethod
    def instance(cls, *args, **kwargs):
        if cls._instance is None:
            cls._instance=cls(*args, **kwargs)
        return cls._instance

a1=Singleton.instance()
a2=Singleton().instance()

print(a1 is a2)

4.基于new方法实现

class Singleton(object):
    _instance=None
    def __init__(self):
        pass


    def __new__(cls, *args, **kwargs):
        if cls._instance is None:
            cls._instance = object.__new__(cls)
        return cls._instance

obj1 = Singleton()
obj2 = Singleton()
print(obj1 is obj2)

5.基于metaclass方式实现

class SingletonType(type):
    _instance=None
    def __call__(cls, *args, **kwargs):
        if cls._instance is none:
            # cls._instance = super().__call__(*args, **kwargs)
            cls._instance = object.__new__(cls)
            cls._instance.__init__(*args, **kwargs)
        return cls._instance

class Foo(metaclass=SingletonType):
    def __init__(self,name):
        self.name = name


obj1 = Foo('name')
obj2 = Foo('name')
print(obj1.name)
print(obj1 is obj2)

标签:__,Singleton,instance,单例,._,def,cls
From: https://www.cnblogs.com/Super-niu/p/17829455.html

相关文章

  • 单例模式
    [实验任务一]:学号的单一仿照课堂的身份证的例子,实现每个同学仅有一个学号这一问题。 packageTutorial_7;/***@authormendianyu*/publicclassStuID{//单例模式中的实例privatestaticStuIDinstance=null;//学号privateStringid;......
  • 每日随笔——单例模式
    [实验任务一]:学号的单一仿照课堂的身份证的例子,实现每个同学仅有一个学号这一问题。实验要求:1.画出对应的类图;2.提交源代码;3.注意编程规范。类图 源码:packageCS7;publicclassClient{publicstaticvoidmain(String[]args){StudentIDstu1,s......
  • 解锁设计模式的神秘面纱:编写无懈可击的代码之单例设计模式
    前言单例设计模式是23种设计模式中最常用的设计模式之一,无论是三方类库还是日常开发几乎都有单例设计模式的影子。单例设计模式提供了一种在多线程情况下保证实例唯一性的解决方案。单例设计模式虽然简单,但是实现方案却非常多,大体上有以下7种最常见的方式。饿汉模式所谓饿汉式,就是......
  • C++跨DLL内存所有权问题探幽(一)DLL提供的全局单例模式
    最近在开发的时候,特别是遇到关于跨DLL申请对象、指针、内存等问题的时候遇到了这么一个问题。问题跨DLL能不能调用到DLL中提供的单例?问题比较简单,就是我现在有一个进程A,有DLLBDLLC,这两个DLL都依赖DLLD的单例,这个时候如果A调用了DLLB和DLLC,那么B和C能否正确引用到这个指......
  • "单"身贵族爱好者必备:新手也能看懂的单例模式入门指南
    大家好,欢迎来到程序视点!前言在前面三期里,我们详细讲解了工厂模式下的三种分类:简单工厂模式(SimpleFactory)工厂方法模式(FactoryMethod)抽象工厂模式(AbstractFactory)其中,简单工厂模式不是我们23中设计模式之气,其他两个设计模式都属于创建型模式的设计方式。今天,我们要接着讲......
  • js给元素添加id,动态方式,举个简单例子
    在JavaScript中,如果你想动态地给一个已经存在的元素添加一个id属性,你可以通过获取那个元素的引用,然后设置它的id属性来实现。这里是一个简单的例子,它展示了如何给一个div元素动态添加一个id://假设我们有一个这样的HTML元素://<div>这是一个div</div> //首先,获取那个要添加i......
  • 单例模式
    单例模式引言 单例设计模式是23种设计模式中最简单、使用最多的设计模式,也是必须掌握的一个设计模式。定义单例模式为系统中的类只允许实例化唯一一个对象这类典型问题提供的解决方案。 许多时候系统只需要拥有一个的全局对象,比如系统中的日历Calendar类就只需要一个......
  • 实验7:单例模式
    实验7:单例模式本次实验属于模仿型实验,通过本次实验学生将掌握以下内容:1、理解单例模式的动机,掌握该模式的结构;2、能够利用单列模式解决实际问题。 [实验任务一]:学号的单一仿照课堂的身份证的例子,实现每个同学仅有一个学号这一问题。实验要求:1. 画出对应的类图;2.提交......
  • 设计模式-单例械
    //Seehttps://aka.ms/new-console-templateformoreinformation//设计模式-单例模式//目的:唯一性,内存资源,GCtffu//保证整个系统中一个类只有一个对象的实例usingSystem.Threading.Channels;Singleton.GetInstance().GetGuid();Singleton.GetInstance().GetGuid()......
  • 双重校验锁实现对象单例
    uniqueInstance采用volatile关键字修饰也是很有必要的,uniqueInstance=newSingleton();这段代码其实是分为三步执行:为uniqueInstance分配内存空间初始化uniqueInstance将uniqueInstance指向分配的内存地址但是由于JVM具有指令重排的特性,执行顺序有可能变成1->3->2。......