使用装饰器实现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。
相关文章