直播电商平台开发,设计模式单例模式

直播电商平台开发,设计模式单例模式

1.说明

单例即只有一个实例,比如说配置、日志、连接池等,可以避免多个实例带来的多余的资源开销,并且在多线程环境下保证数据安全

 

2.类重写__new__

 

1
class Singleton:<br>    _instance = None<br>    def __new__(cls, *args, **kwargs):<br>        if not hasattr(cls, "_instance"):<br>            cls._instance = super().__new__(cls, *args, **args)<br>        return cls._instance<br>s1 = Singleton()<br>s2 = Singleton()<br>print(id(s1), id(s2), s1 is s2)

3.装饰器

我们可以使用functools里的wraps装饰一下,它能保留原有函数的名称和函数属性

 

1
<br>from functools import wraps<br>def singleton(cls):<br>    instance = dict()<br>    @wraps(cls)<br>    def wrapper(*args, **kwargs):<br>        if cls not in instance:<br>            instance[cls] = cls(*args, **kwargs)<br>        return instance[cls]<br>    return wrapper<br>@singleton<br>class Person:<br>    pass<br>s1 = Person()<br>s2 = Person()<br>print(id(s1), id(s2), s1 is s2)

 

4.元类

type创建类时自动调用__init__(),类在创建对象时会自动调用__call__()

 

1
<br>class SingletonMeta(type):<br>    def __init__(cls, *args, **kwargs):<br>        cls._instance = None<br>        super().__init__(*args, **kwargs)<br>    def __call__(cls, *args, **kwargs):<br>        if cls._instance is None:<br>            cls._instance = super().__call__(*args, **kwargs)<br>        return cls._instance<br>class Person(metaclass=SingletonMeta):<br>    pass<br>s1 = Person()<br>s2 = Person()<br>print(id(s1), id(s2), s1 is s2)

 

5.加锁优化

如果不加锁,在多线程情况下可能会同时实例化对象

 

1
<br>from threading import RLock<br>class Singleton:<br>    _instance = None<br>    _lock = RLock()<br>    def __new__(cls, *args, **kwargs):<br>        if cls._instance:<br>            return cls._instance<br>        with cls._lock:<br>            if not cls._instance:<br>                super().__new__(cls, *args, **kwargs)<br>            return cls._instance<br>s1 = Singleton()<br>s2 = Singleton()<br>print(id(s1), id(s2), s1 is s2)

 

以上就是 直播电商平台开发,设计模式单例模式,更多内容欢迎关注之后的文章

 

posted @   云豹科技-苏凌霄  阅读(89)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示