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  中亿丰数字科技  阅读(33)  评论(0)    收藏  举报