Python中实现单例模式

2023-04-03 00:00:00 python 模式

在Python中实现单例模式,有多种方式,下面列举其中的三种常见方式。
使用装饰器实现单例模式:

def singleton(cls):
    instances = {}
    def getinstance():
        if cls not in instances:
            instances[cls] = cls()
        return instances[cls]
    return getinstance
@singleton
class MyClass:
    def __init__(self):
        pass

在这个例子中,我们使用装饰器 singleton 来将 MyClass 转换成单例模式。装饰器 singleton 接受一个类 cls 作为参数,然后返回一个新的函数 getinstance。getinstance 函数会检查是否已经创建过 cls 类的实例,如果没有,则创建一个新的实例并返回,否则返回已经创建的实例。
使用元类实现单例模式:

class Singleton(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 MyClass(metaclass=Singleton):
    def __init__(self):
        pass

在这个例子中,我们定义了一个元类 Singleton,它继承自 type 类。元类 Singleton 实现了 call 方法,当我们创建一个新的类 MyClass 时,Python 会调用元类 Singleton 的 call 方法来实例化 MyClass。在 call 方法中,我们检查是否已经创建过 MyClass 的实例,如果没有,则创建一个新的实例并返回,否则返回已经创建的实例。
使用模块实现单例模式:

class MyClass:
    def __init__(self):
        pass
my_singleton = MyClass()

在这个例子中,我们创建一个模块级别的变量 my_singleton,它是一个 MyClass 的实例。由于模块在 Python 中只会被导入一次,因此 my_singleton 只会被创建一次,从而实现了单例模式。
下面以第一种方式为例,演示如何在Python中实现单例模式:

def singleton(cls):
    instances = {}
    def getinstance():
        if cls not in instances:
            instances[cls] = cls()
        return instances[cls]
    return getinstance
@singleton
class MySingleton:
    def __init__(self):
        self.name = "pidancode.com"
print(MySingleton().name)   # 输出:pidancode.com
print(MySingleton().name)   # 输出:pidancode.com
print(MySingleton().name)   # 输出:pidancode.com

在上面的代码中,我们定义了一个类 MySingleton,并使用装饰器 singleton 将其转换为单例模式。然后我们创建了三个 MySingleton 类的实例,但是它们都是同一个实例,因此输出

相关文章