【Python】让某些属性完全相同的类在程序运行过程中只出现一次

0 背景

现在我希望能实现:当我创建类的实例的时候,如果初始化的属性值和之前创建过的实例是一样的,那就返回之前创建过的实例,而不是去新建一个。

举例:假设有一个类 User 定义如下:

class User:
    def __init__(self, username, password):
        self.username = username
        self.password = password

假设我现在按照如下方式构建实例:

a = User('xiaoming', '123456')

它将创建一个实例 a。若现在我又创建了一个实例 b,它与实例 a 有相同的属性值:

b = User('xiaoming', '123456')

它应该返回之前创建的 a,而不是又去新建一个实例:

print(a is b)    # True

1 实现方式

写一个metaclass:SingletonMeta ,并 override __call__ 方法。然后再定义类的时候,指定 metaclass=SingletonMeta。这样一来,当创建实例的时候,就会去检查是否已经有相同参数的实例存在于 _instances 这个字典中。如果存在,就会返回该已存在的实例,否则会创建新的实例并将其存入字典中。

这样可以确保为每组参数只创建一个类实例。

class SingletonMeta(type):
    _instances = {}

    def __call__(cls, *args, **kwargs):
        key = (cls, args, frozenset(kwargs.items()))
        if key not in cls._instances:
            cls._instances[key] = super().__call__(*args, **kwargs)
        return cls._instances[key]


class User(metaclass=SingletonMeta):
    def __init__(self, username, password: str):
        self.username = username
        self.password = password


if __name__ == '__main__':
    a = User('username', '123456')
    b = User('username', '123456')
    print(a is b)  # Output: True
posted @ 2024-04-03 01:42  Lim_YK  阅读(14)  评论(0)    收藏  举报