Python单例模式(3种常用方式)




单例模式是最常见的一种设计模式,该模式确保系统中一个类有且仅有一个实例

常用的三种实现方式如下:

1、使用模块(推荐)


模块是天然单例的,因为模块只会被加载一次,加载后,其他脚本若导入使用时,会从sys.modules中找到已加载好的模块,多线程下也是如此

编写Singleton.py脚本:

class MySingleton():
    def __init__(self, name, age):
        self.name = name
        self.age = age

其他脚本导入使用:

from Singleton import MySingleton

single1 = MySingleton('Tom', 18)
single2 = MySingleton('Bob', 20)

print(single1 is single2)     # True

2、使用装饰器


可以通过装饰器装饰需要支持单例的类

from threading import RLock

def Singleton(cls):
    single_lock = RLock()
    instance = {}
    def singleton_wrapper(*args, **kwargs):
        # 加锁
        with single_lock:
            if cls not in instance:
                instance[cls] = cls(*args, **kwargs)
        return instance[cls]
    return singleton_wrapper

@Singleton
class MySingleton(object):
    def __init__(self, name, age):
        self.name = name
        self.age = age

# 该方式线程不安全,需要加锁校验

single1 = MySingleton('Tom', 18)
single2 = MySingleton('Bob', 20)

print(single1 is single2)     # True

在装饰器的闭包函数中,判断字典是否已经有类和类实例的键值对。如果没有,则添加一个类和类实例的键值对,如果有,则返回字典中的类实例

3、使用new()方法


Python的__new__()方法是用来创建实例的,可以在其创建实例的时候进行控制

class MySingleton(object):
    single_lock = RLock()
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def __new__(cls, *args, **kwargs):
        # 加锁
        with MySingleton.single_lock:
            if not hasattr(MySingleton, '_instance'):
                MySingleton._instance = super().__new__(cls)
        return MySingleton._instance

single1 = MySingleton('Tom', 18)
single2 = MySingleton('Bob', 20)

print(single1 is single2)     # True

以下代码可帮助理解上述代码:

class MySingleton(object):
    _instance = None
    single_lock = RLock()

    def __new__(cls, *args, **kwargs):
        # 加锁
        with MySingleton.single_lock:
            if cls._instance is None:
                cls._instance = super().__new__(cls)
        return cls._instance

    def __init__(self, name, age):
        self.name = name
        self.age = age

single1 = MySingleton('Tom', 18)
single2 = MySingleton('Bob', 20)

print(single1 is single2)     # True

在Python类中,每次实例化一个类对象时,都会自动先执行__new__方法再执行__init__方法。__new__方法先在内存中为实例对象申请空间,然后__init__方法初始化实例对象

因为__init__方法是在__new__执行完成后自动执行的,每次实例化类的对象时都会执行__init__方法,所以也要对__init__方法进行重写,只有第一次实例化类对象时才执行初始化操作

通过重写__new__方法,如果这个类没有实例对象,则执行__new__,否则直接返回已有的实例,从而实现单例



参考文章:https://blog.csdn.net/bb8886/article/details/131940247


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
单例模式是一设计模式,它确保一个类只能有一个实例,并提供一个全局访问点来访问该实例。 在Python,可以使用以下方式实现单例模式: 1. 使用模块级别的变量:在模块定义一个变量,将其初始化为类的实例,然后在需要使用类的地方导入该模块。由于模块只会被导入一次,所以该变量也只会被创建一次,从而实现了单例模式。 ```python # singleton.py class SingletonClass: def __init__(self): # 初始化操作 pass # 创建一个单例对象 singleton_obj = SingletonClass() # main.py from singleton import singleton_obj # 使用单例对象 ``` 2. 使用装饰器:可以使用装饰器来包装类,使其只能创建一个实例。 ```python def singleton(cls): instances = {} def wrapper(*args, **kwargs): if cls not in instances: instances[cls] = cls(*args, **kwargs) return instances[cls] return wrapper @singleton class SingletonClass: def __init__(self): # 初始化操作 pass # 创建单例对象 obj1 = SingletonClass() obj2 = SingletonClass() print(obj1 is obj2) # 输出:True ``` 3. 使用元类(Metaclass):可以通过定义一个元类,控制类的创建过程,从而实现单例模式。 ```python class SingletonMeta(type): _instances = {} def __call__(cls, *args, **kwargs): if cls not in cls._instances: cls._instances[cls] = super().__call__(*args, **kwargs) return cls._instances[cls] class SingletonClass(metaclass=SingletonMeta): def __init__(self): # 初始化操作 pass # 创建单例对象 obj1 = SingletonClass() obj2 = SingletonClass() print(obj1 is obj2) # 输出:True ``` 这些都是实现单例模式常用方法,你可以根据自己的需求选择合适的方式来实现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值