【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
浙公网安备 33010602011771号