python单例模式设计与实现

smile唐

共 1610字,需浏览 4分钟

 ·

2022-05-11 10:21

单例模式(Singleton Pattern)

一种常用的软件设计模式,该模式主要目的是确保某一个类在内存中只有一个实例对象。

单例模式分为:

  • 懒汉式:类一加载就创建对象

  • 饿汉式:用时才去创建对象


使用场景:

某个服务器程序配置信息放在一个AppConfig类中,程序运行期间很多地方都需要创建AppConfig对象的实例,以调用配置文件内容

这会导致系统中存在很多AppConfig的实例,严重浪费内存资源。

事实上,类似AppConfig这样的类,我们希望在程序运行期间只存在一个实例对象。


单例模式要点:

  • 某个类只能有一个实例

  • 必须自行创建这个实例

  • 必须向整个系统提供这个实例


创建单例模式方法:

  1. 使用模块

  2. 使用__new__

  3. 使用装饰器


1.使用模块

python模块就是天然的单例模式,因为模块在第一次导入时,会生成.pyc文件,第二次导入时,会直接加载.pyc文件。因此,我们只需要把相关函数和数据定义在一个模块中,就可以获得一个单例对象

如果我们真的想要一个单例类,可以考虑这样做:

#tests1.pyclass MyClass(object):def foo(self):    print('MyClass.foo')    my_class_obj=MyClass()
将上面的代码保存在文件 tests1.py 中,然后这样使用:from .tests1 import my_class_objmy_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) #Trueprint(one is two) #Trueprint(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
# 使用@singletonclass Config(object): """全局配置""" pass

在上面,我们定义了一个装饰器 singleton,它返回了一个内部函数 wrapper,该函数会判断某个类是否在字典 _instances 中,如果不存在,则会将 cls 作为 key,cls(*args, **kwargs) 作为 value 存到 instances 中,否则,直接返回 _instances[cls]。


以上就是python单例模式的详细内容。


博客地址:www.tangxuansite.com



浏览 51
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报