使用装饰器实现Python中的单例模式

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

在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 StringSingleton:
    def __init__(self, value):
        self.value = value

s1 = StringSingleton("pidancode.com")
s2 = StringSingleton("皮蛋编程")
print(s1.value) # pidancode.com
print(s2.value) # pidancode.com
print(s1 is s2) # True

在上面的代码中,我们定义了一个名为 singleton 的装饰器,用于将一个类转换为单例模式。在装饰器内部,我们定义了一个字典 instances,用于保存已经创建的实例对象。然后,我们定义了一个名为 get_instance 的函数,用于创建和返回实例对象。如果当前类还没有被实例化,则会调用 cls(args, *kwargs) 来创建实例对象,并将它保存到 instances 字典中,最后返回实例对象。如果当前类已经被实例化,则直接返回保存在 instances 字典中的实例对象。

在定义类时,我们使用 @singleton 装饰器来将 StringSingleton 转换为单例模式。在实例化 StringSingleton 类的时候,我们可以发现 s1 和 s2 指向同一个实例对象,并且它们的值都为 "pidancode.com",因此它们的地址相同,即 s1 is s2 为 True。

相关文章