Python中基于元类的单例模式实现

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

在 Python 中,使用元类可以实现单例模式。元类是用于创建类的类,因此可以通过定义一个元类,在创建类的时候控制类的行为,从而实现单例模式。

下面是一个使用元类实现单例模式的示例代码:

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):
    """
    使用定义的元类创建单例类。
    """

    def __init__(self, name):
        self.name = name


# 创建两个实例,它们实际上是同一个对象。
obj1 = MyClass("pidancode.com")
obj2 = MyClass("皮蛋编程")

print(obj1 is obj2)  # True
print(obj1.name)  # pidancode.com
print(obj2.name)  # pidancode.com

在上面的代码中,我们定义了一个元类 SingletonMeta,该元类维护一个字典 _instances,用于保存每个类的单例实例。在元类的 call 方法中,检查当前类是否已经有实例,如果没有,则通过 super().call 创建一个实例,并将其保存在 _instances 字典中。如果已经有实例了,则直接返回保存的实例。

在我们的示例代码中,我们使用定义的元类 SingletonMeta 创建了一个名为 MyClass 的单例类。我们可以创建多个 MyClass 类的实例,但实际上它们都是同一个对象。

最后,我们输出了两个实例的身份证明符号 is 和它们的名称属性,可以看到它们都是相同的。

相关文章