涉及到类的使用就会有类的实例化,就会有类单例实现的需求,因为重复实例化会浪费资源。python中的单例模式与别的语言相比,单例实现的方法更丰富。虽然python实现单例的模式的方法有很多,不过在体验后我觉得有必要了解和掌握的也就是使用模块和使用装饰器两种,然后了解一下使用__new__方法实现单例。本文地址:http://8408.cn/article/950.html,未经许可,不得转载.
1.使用python模块本文地址:http://8408.cn/article/950.html,未经许可,不得转载.
Python模块本身就包含了一个单例实现逻辑,在第一次导入时,会生成.pyc文件,之后导入,就会直接加载.pyc,因此如果在我们在模块中new实例对象,然后在其它的地方直接引用生成的对象,就是单例模式了,python模块singleton.py内容如下:本文地址:http://8408.cn/article/950.html,未经许可,不得转载.
#模块中的方法 class Singleton(object): def test(self): print("test") #直接初始化类 singleton = Singleton()本文地址:http://8408.cn/article/950.html,未经许可,不得转载.
在其它的地方使用时,直接导入此文件中的对象即是单例模式的对象
from singleton import singleton本文地址:http://8408.cn/article/950.html,未经许可,不得转载.
2.使用__new__方法本文地址:http://8408.cn/article/950.html,未经许可,不得转载.
因为python实例化对象的逻辑是先执行类的__new__方法(默认调用object.__new__)实例化对象,再执行类的__init__方法对这个对象进行初始化,所有我们可以在__new__方法中进行控制以实现单例模式,代码示例如下:本文地址:http://8408.cn/article/950.html,未经许可,不得转载.
class Singleton(object): def __init__(self): pass def __new__(cls, *args, **kwargs): if not hasattr(Singleton, "_instance"): if not hasattr(Singleton, "_instance"): Singleton._instance = object.__new__(cls) return Singleton._instance本文地址:http://8408.cn/article/950.html,未经许可,不得转载.
3.使用装饰器实现单例模式本文地址:http://8408.cn/article/950.html,未经许可,不得转载.
上面的使用__new__方法需要在每个类中去定义方法体,而使用装饰器则可以实现定义一个方法体,然后装饰给所有我们要实现单例模式的类即可,重复利用并简化代码。推荐使用第3种方法.本文地址:http://8408.cn/article/950.html,未经许可,不得转载.
#定义一个单例方法 def Singleton(cls): _instance = {} def _singleton(*args, **kargs): if cls not in _instance: _instance[cls] = cls(*args, **kargs) return _instance[cls] return _singleton #装饰给所有我们要实现单例模式的类即可 @Singleton class Test(object): def test_fun(self): pass本文地址:http://8408.cn/article/950.html,未经许可,不得转载.
关于线程安全的单例模式,上述第2、3种方法能实现单例模式,但并不是线程安全的单例模式,如果有需求实现线程安全,可以进行改造,添加threading模块并进行加锁控制。示例如下。本文地址:http://8408.cn/article/950.html,未经许可,不得转载.
# 使用__new__方法创建基于线程安全的单例模式 import threading class Singleton(object): _instance_lock = threading.Lock() def __init__(self): pass def __new__(cls, *args, **kwargs): if not hasattr(Singleton, "_instance"): with Singleton._instance_lock: if not hasattr(Singleton, "_instance"): Singleton._instance = object.__new__(cls) return Singleton._instance # 使用__new__方法创建基于线程安全的单例模式 import threading def Singleton(cls): _instance = {} lock = threading.Lock() def _singleton(*args, **kargs): with lock: if cls not in _instance: _instance[cls] = cls(*args, **kargs) return _instance[cls] return _singleton #装饰给所有我们要实现单例模式的类即可 @Singleton class Test(object): def test_fun(self): pass本文地址:http://8408.cn/article/950.html,未经许可,不得转载.
关于多线程模块,thread模块已被废弃,在Python3中不能再使用thread模块。用户可以使用threading模块代替。本文地址:http://8408.cn/article/950.html,未经许可,不得转载.
本文地址:http://8408.cn/article/950.html 未经许可,不得转载. 手机访问本页请扫描右下方二维码.
手机扫码直接打开本页面 |