def __new__(cls, backend=None, prefix=None, **kwargs): if backend is None and prefix is None: backend = 'disk' if backend is not None and backend not in cls._backends: raise ValueError( f'Backend {backend} is not supported. Currently supported ones' f' are {list(cls._backends.keys())}') if prefix is not None and prefix not in cls._prefix_to_backends: raise ValueError( f'prefix {prefix} is not supported. Currently supported ones ' f'are {list(cls._prefix_to_backends.keys())}') # concatenate the arguments to a unique key for determining whether # objects with the same arguments were created arg_key = f'{backend}:{prefix}' for key, value in kwargs.items(): arg_key += f':{key}:{value}' if arg_key in cls._instances: _instance = cls._instances[arg_key] else: # create a new object and put it to _instance _instance = super().__new__(cls) if backend is not None: _instance.client = cls._backends[backend](**kwargs) else: _instance.client = cls._prefix_to_backends[prefix](**kwargs) cls._instances[arg_key] = _instance return _instance
时间: 2024-02-10 16:10:01 浏览: 101
django基础学习之send_mail功能
这段代码是 Python 中的一个类的构造方法 __new__,它用于创建一个新对象并返回它。这个类接受三个参数:backend、prefix 和 **kwargs。如果 backend 和 prefix 都没有被指定,则默认使用 disk 作为 backend。如果指定的 backend 或 prefix 不在 _backends 或 _prefix_to_backends 中,则会引发一个 ValueError 异常。这个类会将所有的参数拼接成一个唯一的 key,用于判断是否已经创建了具有相同参数的对象。如果已经创建了这样的对象,则返回已有的对象;否则,创建一个新对象并将其存储到 _instances 中。根据参数指定的 backend 或 prefix,创建一个新的 client 对象,并将其赋值给新创建的实例对象的 client 属性。最后,返回新创建的对象。
阅读全文