python单例模式设计与实现
单例模式(Singleton Pattern)
一种常用的软件设计模式,该模式主要目的是确保某一个类在内存中只有一个实例对象。
单例模式分为:
懒汉式:类一加载就创建对象
饿汉式:用时才去创建对象
使用场景:
某个服务器程序配置信息放在一个AppConfig类中,程序运行期间很多地方都需要创建AppConfig对象的实例,以调用配置文件内容
这会导致系统中存在很多AppConfig的实例,严重浪费内存资源。
事实上,类似AppConfig这样的类,我们希望在程序运行期间只存在一个实例对象。
单例模式要点:
某个类只能有一个实例
必须自行创建这个实例
必须向整个系统提供这个实例
创建单例模式方法:
使用模块
使用__new__
使用装饰器
1.使用模块
python模块就是天然的单例模式,因为模块在第一次导入时,会生成.pyc文件,第二次导入时,会直接加载.pyc文件。因此,我们只需要把相关函数和数据定义在一个模块中,就可以获得一个单例对象
如果我们真的想要一个单例类,可以考虑这样做:
#tests1.py
class MyClass(object):
def foo(self):
print('MyClass.foo')
my_class_obj=MyClass()
将上面的代码保存在文件 tests1.py 中,然后这样使用:
from .tests1 import my_class_obj
my_class_obj.foo()
2.使用__new__
使用__new__来控制实例创建过程
例:
MyClass(object):
_instance = None
def __new__(cls, *args, **kwargs):
if not cls._instance:
cls._instance = super(MyClass, cls).__new__(cls, *args, **kwargs)
return cls._instance
class HerClass(MyClass):
a = 1
# 在上面的代码中,我们将类的实例和一个类变量 _instance 关联起来,如果 cls._instance 为 None 则创建实例,否则直接返回 cls._instance。
# 执行情况如下:
one = HerClass()
two = HerClass()
print(one == two) #True
print(one is two) #True
print(id(one), id(two)) #42818864 42818864
3.使用装饰器
装饰器的作用中就有可以动态修改一个类或函数的功能,所以我们也可以使用装饰器,使某个类只能生成一个实例
例:
def singleton(cls):
"""单例模式装饰器"""
_instance = {}
def wrapper(*args, **kwargs):
if cls not in _instance:
_instance[cls] = cls(*args, **kwargs)
return _instance[cls]
return wrapper
# 使用
class Config(object):
"""全局配置"""
pass
在上面,我们定义了一个装饰器 singleton,它返回了一个内部函数 wrapper,该函数会判断某个类是否在字典 _instances 中,如果不存在,则会将 cls 作为 key,cls(*args, **kwargs) 作为 value 存到 instances 中,否则,直接返回 _instances[cls]。
以上就是python单例模式的详细内容。
博客地址:www.tangxuansite.com
评论