单例模式
单例是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__--->判断之前有没有创建过,如果创建过,直接返回
标签:__,单例,---,导入,线程,模块 From: https://www.cnblogs.com/YeeQX/p/17772932.html