Python - 实现【单例模式】的四种方法
  OHxphH6Es7WL 2023年12月09日 19 0


方法一:使用模块实现单例模式

Python 中,每个模块只会被导入一次,因此可以将需要实现单例模式的类定义在一个模块中,每次需要使用该类时,将该模块导入即可。

# singleton.py
class Singleton:
    pass

singleton = Singleton()

在其他模块中直接引用这个singleton对象即可。

2.方法二:使用__new__方法实现单例模式:

__new__方法在创建一个实例时被调用,因此我们可以通过重写__new__方法来控制实例的创建。在实现单例模式时,我们可以在__new__方法中判断是否已经存在该实例,若存在直接返回实例,否则创建实例并返回。

class Singleton:
    _instance = None

    def __new__(cls):
        if cls._instance is None:
            cls._instance = super().__new__(cls)
        return cls._instance

在实例化Singleton类时就会判断是否已经存在实例,若存在则直接返回实例,否则创建实例并返回。

方法三:使用装饰器实现单例模式:

我们可以使用装饰器将一个类装饰成一个单例类,这样每次实例化该类时都会返回同一个实例。实现的方法是使用一个字典来缓存各个类的实例,然后在装饰器中判断该类是否已经存在实例,若存在直接返回实例,否则创建实例并将其加入字典中。

def singleton(cls):
    _instances = {}
    def wrapper(*args, **kwargs):
        if cls not in _instances:
            _instances[cls] = cls(*args, **kwargs)
        return _instances[cls]
    return wrapper

@singleton
class Singleton:
    pass

在实例化Singleton类时会先调用singleton装饰器,该装饰器会判断该类是否已经存在实例,若存在则直接返回实例,否则创建实例并缓存起来。

方法四:使用元类实现单例模式:

元类是用于创建类的类,我们可以通过重写元类的__call__方法来控制类的实例化过程。在实现单例模式时,我们可以在元类的__call__方法中判断是否已经存在该类的实例,若存在直接返回实例,否则创建实例并缓存起来。

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 Singleton(metaclass=SingletonMeta):
    pass

在实例化Singleton类时首先会调用元类SingletonMeta__call__方法,该方法会判断该类是否已经存在实例,若存在则直接返回实例,否则创建实例并缓存起来。


【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年12月09日 0

暂无评论

推荐阅读
  jq7eR2BySqXr   2023年12月12日   44   0   0 缓存redis缓存redis
OHxphH6Es7WL
最新推荐 更多

2024-05-17