python中实现单例模式

简介: 单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在。例如:服务器程序的配置信息存放在一个文件中,客户端通过一个 Config 的类来读取配置文件的信息。当有很多地方都需要使用配置文件的内容时就需要创建 创建多个Config 对象的实例,从而浪费内存资源,尤其是在配置文件内容很多的情况下。

单例模式

简介:

单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在。

例如:服务器程序的配置信息存放在一个文件中,客户端通过一个 Config 的类来读取配置文件的信息。当有很多地方都需要使用配置文件的内容时就需要创建 创建多个Config 对象的实例,从而浪费内存资源,尤其是在配置文件内容很多的情况下。

列举几种实现单例的方法:

1、使用import调用模块:

Python 的模块就是天然的单例模式,当模块在第一次导入时,会生成 .pyc 文件,当第二次导入时,就会直接加载 .pyc 文件,不再次执行模块代码。所以将相关的函数和数据定义在一个模块中,可以获得一个单例对象。

比如:创建一个py文件sing,写一个SingOK类,在类里创建一个func方法,并实例化一个singleton对象(必须,因为如果你再另一个模块调用的是SingOK这个类然后再实例化对象,就不是单例模式了),在另一个py文件中调用如下:

from SingOK import  singleton
singleton.func()

# 查看是否是单例, 两个变量指向同一个地址
a = singleton
b = singleton
print(id(a))
print(id(b))
2.使用装饰器:

通过装饰器,将创建的类在实例化的时候只使用同一个类第一次实例化的结果。之后相同的类只取字典instances中的实例。

from functools import wraps
def singleton(cls):
    instances = {}
    @wraps(cls)
    def _singleton(*args, **kwargs):
        if cls not in instances:
            instances[cls] = cls(*args, **kwargs)
        return instances[cls]
    return _singleton

注意:网上有下面这种写法,是由于对于装饰器理解不透彻导致,这样做是可以使用同一个实例。但是对于传参的类,实例化的时候会报错的。原因是内部的函数_singleton并没有形参,应该将singleton的形参放到_singleton来。

from functools import wraps
def singleton(cls, *args, **kwargs):
    instances = {}
    @wraps(cls)
    def _singleton():
        if cls not in instances:
            instances[cls] = cls(*args, **kwargs)
        return instances[cls]
    return _singleton

测试上面的注意事项的代码:

@singleton
class sg:

    def __init__(self, id):
        self.id = id

    def name(self):
        print('name')

a = sg('23')
b = sg('45')
a.name()
print(id(a))
print(id(b))
3.使用__new__()方法

python类中的__new__()方法是真正创建一个实例的方法,每创建一个实例的时候都会先调用它去new一个实例对象。重写类中的__new__()方法使之成为单例。

class Tools(object):
    instance = None

    def __new__(cls, *args, **kwargs):
        if cls.instance is None:
            cls.instance = super(Tools, cls).__new__(cls)
        return cls.instance

或者:

class Tools(object):

    def __new__(cls, *args, **kwargs):
        if not hasattr(cls, 'instance'):
            cls.instance = super(Tools, cls).__new__(cls)
        return cls.instance
目录
相关文章
|
6月前
|
Python
如何在Python中实现单例模式?
【1月更文挑战第15天】
47 2
|
27天前
|
设计模式 存储 数据库连接
Python编程中的设计模式之美:单例模式的妙用与实现###
本文将深入浅出地探讨Python编程中的一种重要设计模式——单例模式。通过生动的比喻、清晰的逻辑和实用的代码示例,让读者轻松理解单例模式的核心概念、应用场景及如何在Python中高效实现。无论是初学者还是有经验的开发者,都能从中获得启发,提升对设计模式的理解和应用能力。 ###
|
2月前
|
设计模式 缓存 数据库
Python中的单例模式
单例模式确保一个类只有一个实例,并提供全局访问点。此模式常用于共享资源或限制资源访问,可避免资源浪费并简化全局访问。其实现方法包括使用模块级变量、装饰器或元类。尽管单例模式能简化访问和初始化,但也可能引入全局状态,影响代码的可维护性。适用于配置管理、数据库连接池等场景。
|
3月前
|
设计模式 存储 数据库连接
Python设计模式:巧用元类创建单例模式!
Python设计模式:巧用元类创建单例模式!
48 0
|
5月前
|
设计模式 测试技术 数据库
Python单例模式详解与实际应用
单例模式是一种特殊的设计模式,它通过限制一个类的实例数量为一个来保证只有一个实例被创建,并且提供一个全局访问点以供其他对象使用。
81 3
|
4月前
|
设计模式 缓存 数据库
Python中的单例模式是什么?
**摘要:** 单例模式是一种设计模式,确保类只有一个实例并提供全局访问点。常用于共享资源、配置管理、数据库连接池、日志记录和缓存。Python中可使用模块级变量、装饰器或元类实现单例。需谨慎使用,以避免全局状态导致的复杂性。
|
6月前
|
存储 安全 Python
如何在Python中实现一个单例模式,确保在多线程环境中也是安全的?
【2月更文挑战第5天】【2月更文挑战第11篇】如何在Python中实现一个单例模式,确保在多线程环境中也是安全的?
183 1
|
6月前
|
存储 安全 Python
|
Python
62 python - 单例模式
62 python - 单例模式
30 0
|
缓存 安全 开发者
Python 单例模式讲解和代码示例
Python 单例模式讲解和代码示例
49 0