Python 单例实现

Python 单例实现

使用装饰器实现单例模式

使用装饰器实现单例模式的方法比较简单,只需要定义一个装饰器函数,将其应用到需要实现单例模式的类上即可。具体的实现方法如下:

def singleton(cls):
    instances = {}
    def get_instance(*args, **kwargs):
        if cls not in instances:
            instances[cls] = cls(*args, **kwargs)
        return instances[cls]
    return get_instance

@singleton
class MyClass:
    pass

在这个例子中,我们定义了一个名为 singleton 的装饰器函数,它接受一个类 cls 作为参数,并返回一个新的函数 get_instanceget_instance 函数会判断 cls 类是否已经存在实例,如果不存在,则创建一个新的实例,并将其保存在 instances 字典中。最后返回该实例。

要使用这个装饰器实现单例模式,只需要将需要实现单例模式的类加上 @singleton 装饰器即可。例如,上面的例子中,我们将名为 MyClass 的类加上 @singleton 装饰器,即可将其实现为单例模式。

使用元类实现单例模式

使用元类实现单例模式的方法略微复杂一些,需要先定义一个元类,并将其作为需要实现单例模式的类的元类。具体的实现方法如下:

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 MyClass(metaclass=SingletonMeta):
    pass

在这个例子中,我们定义了一个名为 SingletonMeta 的元类。该元类定义了一个字典 instances,用于保存所有实例化过的类。在 __call__ 方法中,我们首先检查该类是否已经存在实例,如果不存在,则调用父类的 __call__ 方法创建一个新的实例,并将其保存在 instances 字典中。最后返回该实例。

要使用这个元类实现单例模式,只需要将需要实现单例模式的类的元类设置为 SingletonMeta,例如上面的例子中,我们将名为 MyClass 的类的元类设置为 SingletonMeta,即可将其实现为单例模式。

需要注意的是,在 Python 3 中,如果需要使用元类,必须将元类的定义写在类的继承列表中,例如 class MyClass(metaclass=SingletonMeta):

作者:燕春

posted @ 2023-03-21 13:34  中亿丰数字科技  阅读(8)  评论(0)    收藏  举报