单例

发布时间 2023-10-18 17:34:32作者: 别管鱼油我了

单例模式

单例是23种设计模式的一种,最简单的一种

https://www.cnblogs.com/liuqingzheng/p/10038958.html

什么是单例模式?

单例模式指的是:保证一个类仅有一个实例,并提供一个访问它的全局访问点

线程1 执行:

cursor.excute('select * from user')

线程2执行:

cursor.excute('select * from books')

线程1 执行

cursor.fetchAll() # 本来想取线程1的数据,但是拿出查询到的数据得到线程2的数据

综上,所以django ,每个线程,一个连接对象,不然就会数据错乱---》 有了连接池

使用单例五种方法

方法1、使用模块

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

通俗来说,当第一次导入后会生成一个文件pyc,当后续再次使用这个模块导入时,就不会再执行代码了,会从pyc中直接拿出来用。

mysingleton.py

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

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

from mysingleton import singleton

 

方法2、使用装饰器

之前学的 装饰器,都是用来装饰 函数 ,装饰器可以用来装饰类

 执行结果为True

 

单例3、使用类方法

 

方法4、使用 __new__

通俗的讲解Python中的__new__()方法-CSDN博客

__init__ 和 __new__ 区别是什么
1 类()--->触发类中的__init__--->对象已经创建出来了,不能拦截住,做成单例了
2 类()--->触发类中的__new__--->真正的创建对象,判断之前有没有创建过,如果创建过,直接返回
3 懂了元类---》类()--->触发元类的 __call__--->判断之前有没有创建过,如果创建过,直接返回