欢迎访问宙启技术站
智能推送

Python中的装饰器函数应用:实现单例模式

发布时间:2023-07-06 00:08:48

在Python中,装饰器是一种函数,它可以在不修改原始函数代码的情况下,向其添加额外的功能。

单例模式是一种设计模式,它保证一个类只有一个实例,并提供了一个全局访问点来访问该实例。在Python中,使用装饰器可以很方便地实现单例模式。

下面是一个使用装饰器实现单例模式的示例代码:

def singleton(cls):
    instances = {}

    def wrapper(*args, **kwargs):
        if cls not in instances:
            instances[cls] = cls(*args, **kwargs)
        return instances[cls]

    return wrapper


@singleton
class SingletonClass:
    def __init__(self, name):
        self.name = name

    def say_hello(self):
        print(f"Hello, I am {self.name}")

在上面的代码中,我们定义了一个装饰器函数singleton,它接受一个类作为参数,并返回一个新的函数wrapperwrapper函数在执行时会先检查该类是否已经存在一个实例,如果存在则直接返回该实例,否则创建一个新的实例并返回。

然后我们使用装饰器@singleton来修饰SingletonClass类。这样就可以保证SingletonClass类只有一个实例。

我们可以通过以下代码来测试单例模式的效果:

obj1 = SingletonClass("Alice")
obj2 = SingletonClass("Bob")

print(obj1 is obj2)  # True
obj1.say_hello()  # Hello, I am Alice
obj2.say_hello()  # Hello, I am Alice

在测试代码中,我们创建了两个SingletonClass类的实例obj1obj2,然后通过obj1 is obj2来判断两个实例是否相等,可以看到返回的结果是True,说明obj1obj2指向的是同一个实例。

接下来,我们调用obj1.say_hello()obj2.say_hello()两个方法,可以发现它们输出的结果都是Hello, I am Alice,说明obj1obj2都是同一个实例,修改其中一个实例的属性会影响到另一个实例。

通过上述示例,我们可以看到装饰器在实现单例模式时非常方便和灵活,可以通过简单的装饰器修饰一个类,就可以实现该类的单例模式。