Python中的__new__方法和单例模式

2023-04-03 00:00:00 python

在Python中,每个类都有一个特殊的方法 new()。这个方法在实例化对象时会被调用,用于创建实例对象并返回它。在使用单例模式时,我们可以利用 new() 方法来确保只创建一个实例对象。

下面是一个简单的示例代码,演示如何使用 new() 方法来实现单例模式:

class Singleton:
    _instance = None

    def __new__(cls, *args, **kwargs):
        if not cls._instance:
            cls._instance = super().__new__(cls, *args, **kwargs)
        return cls._instance

s1 = Singleton()
s2 = Singleton()
print(s1 is s2) # True

在上面的代码中,我们定义了一个名为 Singleton 的类,并在其中定义了一个类变量 _instance,用于保存实例对象。在 new() 方法中,我们首先检查 _instance 是否为空,如果为空,则调用父类 new() 方法来创建实例对象,并将它赋值给 _instance,最后返回 _instance。

在实例化 Singleton 类的时候,我们可以发现 s1 和 s2 指向同一个实例对象,因此它们的地址相同,即 s1 is s2 为 True。

下面是一个使用字符串作为单例模式的示例代码:

class StringSingleton:
    _instance = None

    def __new__(cls, *args, **kwargs):
        if not cls._instance:
            cls._instance = super().__new__(cls, *args, **kwargs)
            cls._instance.value = args[0]
        return cls._instance

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

在上面的代码中,我们定义了一个名为 StringSingleton 的类,并在 new() 方法中将输入的字符串作为实例对象的值。在实例化 StringSingleton 类的时候,我们可以发现 s1 和 s2 指向同一个实例对象,并且它们的值都为 "pidancode.com",因此它们的地址相同,即 s1 is s2 为 True。

相关文章