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_instance。get_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):。
标签:__,instances,Python,元类,实现,单例,cls From: https://www.cnblogs.com/DTCLOUD/p/17239699.html作者:燕春