直播电商平台开发,设计模式单例模式
直播电商平台开发,设计模式单例模式
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) |
以上就是 直播电商平台开发,设计模式单例模式,更多内容欢迎关注之后的文章
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现